1500

il doit y avoir des meilleurs designs, oui. mais redéfinir le même nom de struct ne change rien au design qui utilise un cast de CUSTOM_DATA*. c'est juste une bidouille pour éviter d'écrire à chaque fois tes casts.

après, on parlait de casts de pointeurs, c'est pas vraiment la même problématique que les casts de nombres
avatar

1501

Est-ce qu'un feof() sur un fichier juste ouvert pourra me dire si le fichier est vide, ou dois-je tenter d'abord une lecture (même bidon) pour que l'indicateur de fin de fichier soit valable?
Je n'ai trouvé aucune garantie de ce côté, et il y a apparemment pas mal de détails qui divergent dans les différentes implémentations de la libc au niveau des fonctions f*...

1502

Je ne vois pas trop en quoi tu devrais te préoccuper de faire une lecture avant d'utiliser feof confus (je peux me tromper, mais ça me paraîtrait débile comme comportement)

Si tu veux juste savoir si un fichier est vide, pkoi ne pas utiliser fsize ?

1503

parce que j'ai pas en tête toutes les fonctions de la libc, et que j'avais zappé celle-là, merci bien tongue


hmm -> ya un fsize dans la libc standard ? ie pas que chez MS, en tout cas ya une entrée sur msdn, une fonction qui renvoie bien la taille d'un fichier, mais mon "man fsize" ne renvoie rien, et http://www.google.fr/search?hl=fr&q=fsize+libc&aq=f&aqi=&aql=&oq=&gs_rfai= n'est guère bavard confus

1504

Pas de quoi cheeky

1505

(j'ai édité cheeky cry)

fsize();
warning implicit declaration of fsize
error can't resolve fsize

^^

1506

oué j'ai vu, je vérifie, dsl grin

1507

Pour connaître la taille d'un fichier, en général, on utilise fseek et ftell.

Sinon, il y a aussi stat qui peut te donner entre autre la taille d'un fichier.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1508

Diverses solutions posix ici : http://fr.how-to.mobi/index.php?id=8236

dsl pour l'info erronée, je ne fais plus tellement de C depuis un moment (et plutôt sous Windows de toute façon)


cross : oué, un fseek(fp, 0, SEEK_END) suivi d'un ftell fait l'affaire, ça me rappelle des trucs ^^ (stat étant la solution posix développée dans mon lien)

1509

Ca marche ça ?
if (fseek(f, 0, SEEK_SET) == fseek(f,0, SEEK_END))
?

J'ai pas pensé à un trick de ce genre en effet...

(cross, je regarde ce que vous proposez smile)

1510

arg c'est quoi cette idée de malade grin

il suffit de faire if fseek(f,0,SEEK_END)==0) grin

1511

Ok, la technique fseek/ftell, c'est de mettre le pointeur de flux à la fin du fichier, et de lire son offset.

En fait, je m'attends dans mon fichier à avoir un uint16_t au début. Donc je le lis, et si après ça j'ai trouvé feof(f) != 0, ben je me dis que le fichier était vide grin


(cross : ah oui, c'est vrai que fseek(f, 0, SEEK_SET) == 0 tout le temps triso)

Je comprends les fonctions de la libc, mais je crois qu'on voit que je manque de pratique grin

Au fait, j'ai pas trouvé dans man, fread déplace le pointeur de flux après ce qu'on a lu ?

1512

Bien sûr ! Le but d'une fonction c'est qu'elle se charge du boulot sans qu'on ait à se poser trop de questions. T'es pas censé savoir ce qu'il y a dans la structure FILE de toute façon. (tout ça dans une certaine limite, certes cheeky)

1513

Ah ben c'est parfait alors, merci pour tout. smile

(dans PedroM, un FILE c'est un HSym embarrassed)

1514

Pas de quoi cheeky
(tongue)

1515

Folco (./1513) :
(dans PedroM, un FILE c'est un HSym embarrassed)

Et dans TIGCCLIB, c'est une struct{char*fpos;void*base;unsigned short handle;short flags;short unget;unsigned long alloc;unsigned short buffincrement;}. smile
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1516

Ouep, c'est mieux de ne pas se baser sur ce qu'il y a derrière ^^
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1517

Bon, autre "problème", qui n'en est peut-être pas un en soi (ça marche bien), mais je ne doit pas m'y prendre au mieux en l'occurence (qu'importe le code, regardez juste la structure) :
                        if (((CAREER_DATA*)data->customData)->careersPtr != NULL)
                        {
                            ;
                        }
                        else    /* memory error */
                        {
                            fclose (scoresFile);
                            free (data->customData);
                            free (data);
                            error = EXIT_FAILURE;
                            fprintf (stderr, outOfMemory);
                            return NULL;
                        }
                    }
                    else    /* memory error */
                    {
                        fclose (scoresFile);
                        free (data);
                        error = EXIT_FAILURE;
                        fprintf (stderr, outOfMemory);
                        return NULL;
                    }

                }
                else    /* invalid number of careers */
                {
                    fprintf(stderr, fileCareersInvalid);
                    fclose(scoresFile);
                    numberEntries = 0;
                }
            }
            else    /* eof encountered at opening, file doesn't exist */
            {
                fclose (scoresFile);
                numberEntries = 0;
            }
        }
        else    /* error when opening 'careers' */
        {
            fprintf(stderr, couldntOpenCareers);
            numberEntries = 0;
        }

Comme vous le voyez dans cette cascade de else{}, il y a beaucoup de code récurrent (error, fprintf, fclose etc...). Y a-t-il une manière plus élégante de fermer ce qu'on fait quand ça échoue quelque part, entre diverses allocations et ouvertures de fichiers ? J'ai pensé à une fonction, mais ça implique d'initialiser tous les paramètres, et à passer tout en argument, ça me semble tout aussi lourd.

Vous faites comment ?

Brunni -> même en assembleur je jouais pas à ça, j'ai jamais aimé hacker (sauf aucune autre solution technique, et je n'ai qu'un exemple en tête pour la programmation sur TI, c'est l'accès au variables globales pour une interruption dans un programme read-only).

1518

en C ? J'ai pas franchement lu, mais en C, on conseille l'utilisation de goto pour gérer plus facilement les erreurs imbriquées.

1519

Fallait pas lire toute façon, mais c'est bien de gestion d'erreurs imbriquées dont il s'agit. Donc idéalement, tu ferais ça :
Erreur3:
<code>
Erreur2:
<code>
Erreur1:
<code>

1520

Tu te rappelles des exceptions? Dans ce cas ça aurait été plus simple avec, non?
A ce moment là tu peux te dire qu'elles n'ont pas été inventées pour rien wink
(et si ça peut te rassurer - mais ça devrait pas - je fais pareil en C)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1521

Je suis en C, là grin

1522

Justement, en C on fait comme ça parce qu'il n'y a pas le choix, mais si C++ a choisi d'introduire les exceptions, c'est justement pour rendre ce genre de code plus joli et facile à maintenir. C'est aussi une bonne démarche de passer par C pour se rendre compte par la pratique quand les "nouvelles" constructions du C++ sont utiles smile
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1523

Folco (./1519) :
Fallait pas lire toute façon, mais c'est bien de gestion d'erreurs imbriquées dont il s'agit. Donc idéalement, tu ferais ça :
Erreur3:
<code>
Erreur2:
<code>
Erreur1:
<code>

oui (avec erreur3 la plus profonde et qui exécute aussi erreur2 et erreur1, mais je suppose que c'est bien comme ça que tu l'as compris)

1524

Oui, c'est pour ça que j'ai "inversé" les numéros des erreus

1525

Mais pourquoi tu es reparti sur du C ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

1526

Parce que yavait des trucs que j'arrivais pas à solutionner en C++. Maintenant j'y arriverais, j'ai trouvé les combines qu'il faudrait grâce au fait que le C soit plus bas niveau. Mais je me suis fait mes objets et héritages/polymorphismes tellement c'est bon grin

1527

(mais n'aies crainte, d'après le théorème de Jyaif, j'y reviendrai sûrement trioui Tous vos conseils n'auront, de tout façon, pas été vains smile)

1528

Utilise goto, cette commande est là pour ça. smile
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1529

Il n'y a pas de switch cas en C ?
avatar

1530

si, mais ça ne résout pas le problème présent.