Partage
  • Partager sur Facebook
  • Partager sur Twitter

Violation Accès 0x000000

Erreur sous Visual Studio

    12 juillet 2019 à 12:58:30

    Bonjour

    Pour mon travail je suis amené à développer en C (une application utilisant des librairies lib ou dll fournies par un constructeur).
    Je cherche à appeler une fonction dans mon programme (tout simple pour le moment) mais j'obtiens lors de la compilation l'erreur suivante :

    Violation d'accès lors de l'exécution à l'emplacement 0x00000000. a eu lieu

    Comme je débute en C j'avoue être un peu perdu.
    Je place ci-dessous mon code

    #include <stdio.h>
    #include <stdlib.h>
    #include "fourn.h"


    int main(void)
    {
        // Déclarations Variables
        unsigned short retourFonction = 0;
        unsigned char *paramA = NULL;
        MaStructure *paramB = NULL;
        unsigned short *paramC = NULL;
        unsigned short *paramD = NULL;

        // Utilisation de la Fonction Obtenir Infos
        retourFonction = obtenirInfos(paramA,paramB,paramC,paramD);
    }

    La fonction est définie ainsi
    unsigned short obtenirInfos( unsigned char * paramA,MaStructure* paramB,unsigned short * paramC,unsigned short * paramD );

    J'ai remplacé le nom de la fonction ainsi que celui des variables car les fonctions fournies par ce constructeur ne doivent pas être partagée.

    A quoi est du mon problème...? Une mauvaise déclaration de mes variables...?

    Modification du message :

    Je continue à chercher et ai tente le code suivant

    unsigned short reponseFonction = 0;
    unsigned char paramA = "C:\\xxxxxx\\";
    T_InfosLecteur paramB[1];
    unsigned short paramC = 0;
    unsigned short paramD = 0;

    reponseFonction = obtenirInfos(paramA paramB &paramC, &paramD);

    J'ai changé le code car :
    - Mes variables "ne sont plus NULL"
    - Le param B doit être un tableau de structure
    - Les paramC et paramD doivent être passés par adresse.

    J'obtiens toujours la violation d'accès. Mais dans la fenêtre du Debugger, j'ai 0x0000000 comme valeur pour la fonction obtenirInfos

    -
    Edité par Juanito de Dironne 12 juillet 2019 à 14:48:27

    • Partager sur Facebook
    • Partager sur Twitter

    Heureux les fêlés car ils laissent passer la lumière...

      12 juillet 2019 à 15:30:07

      Au vu de l'erreur tu tente d'écrire à l'adresse 0, probablement à cause d'un pointeur qui n'est pas initialisé avec une adresse valide mais à NULL.

      Je n'ai pas regardé ton code, car tu n'a pas utilisé le bouton code </> du forum pour le poster.

      • Partager sur Facebook
      • Partager sur Twitter
        12 juillet 2019 à 16:11:15

        +1

        A mon avis il n'y a pas du avoir d'allocation mémoire dédiée aux pointeurs utilisés. Bref, as-tu fait les malloc nécessaires? 

        • Partager sur Facebook
        • Partager sur Twitter
          14 juillet 2019 à 9:37:06

          Salut !

          Je confirme ce que disent les autres dans leurs posts : quand tu initialises un pointeur à NULL, tu ne peux pas t'en servir tant qu'ils ne sont pas alloués en mémoire. Le premier code que tu as posté m'a l'air correct, mais je ne vois pas ce qui se passe dans ta fonction obtenirInfos().

          Si tu veux stocker ou lire quoi que ce soit à partir de ces pointeurs, il faut leur donner une adresse valide (0x00000000 correspond à NULL).

          Voici le bon format :

          type *nomDePointeur = malloc(sizeof(type));
          

          Ensuite, tu dois vérifier que l'allocation a été faite. Par exemple :

          if(nomDePointeur == NULL)
          {
              fprintf(stderr, "Erreur : mauvaise allocation.\n");
              exit(EXIT_FAILURE);
          }

          Et bien sûr, pour éviter une fuite de mémoire, il faut désallouer (à chaque malloc() son free()) :

          free(nomDePointeur);

          Gardons en tête qu'un pointeur est une adresse et que quand tu l'utilises tu cherches à jouer avec une valeur qui se trouve à cette adresse, mais si cette adresse est NULL... comment jouer avec la valeur qui est associée ? Ben tu peux pas. C'est pour ça que le malloc() doit te donner un endroit en mémoire que tu auras le droit de "toucher".

          En espérant avoir donné une réponse assez complète.

          • Partager sur Facebook
          • Partager sur Twitter
            14 juillet 2019 à 10:13:56

            Bonjour,

            Il faut tout d'abord distinguer les paramètres en entrée (ceux qui apportent de l'information à la fonction) des paramètres en sortie (la fonction reçoit un pointeur sur quelque chose, elle utilise ce pointeur pour "remplir" le quelque chose.)

            Les paramètres en entrée se reconnaissent à :
            - ça n'est pas un pointeur : la fonction reçoit une copie du paramètre donc ne pourra jamais modifier l'original.
            - c'est un pointeur sur un/des objet(s) const ; le pointeur n'est utilisable que pour lire

            La fonction présentée ici n'a aucun paramètre de ce type, on en conclu donc :
            - tous les paramètres sont des données en sortie (donc on est dans la magie, elle ne reçoit rien et sait tout calculer!)
            - ou tous les paramètres sont en sortie mais certains sont en entrée-sortie (servent à la fois à transmettre quelque chose et modifiés par la fonction). Dans ce cas la notice d'explication de la fonction doit être très explicite.
            - ou la fonction est très mal définie faisant passer des entrées pour des sorties(d'où l'interdiction du constructeur de de donner des infos, il a trop honte!)

            Ici il peut y avoir plantage pour plusieurs possibles raisons :
            - un paramètre n'est pas accessible en écriture. Exemple possible : ton premier paramètre qui pointe sur une zone constante.
            - un paramètre en entrée contient une valeur invalide. Exemple possible : tes 4 paramètres car pas d'info sur quoi mettre.
            - un paramètre pointe sur une zone invalide. Exemple : tes 4 paramètres dans le cas de ton code initial.
            - un paramètre pointe sur une zone trop petite. Exemple possible : les 3 derniers paramètres.

            Dans tous les cas, quoi faire :
            - lire la documentation sur le paramètres attendus par la fonction, et respecter ces demandes.
            - en l'absence de documentation : s'adresser à Harry Potter car de solution dans le monde réel.

            • Partager sur Facebook
            • Partager sur Twitter

            En recherche d'emploi.

              15 juillet 2019 à 9:59:35

              Bonjour

              Tout d'abord un grand merci pour vos réponses.
              Elles confortent le débutant en langage C que je suis dans cette idée que "mes variables sont mal initialisées".
              Et avant de lire toutes vos réponses, ce matin, j'avais déjà revu mon code avec les éléments suivants :

              int main(void)
              {
              	// Déclarations Variables
              	char caracSortieProg = 0;
              	unsigned short reponseFonction = 0;
              	unsigned char paramA[] = "C:\\XXXXXX\\";
              	T_InfosLecteur listeParamB[1];
              	unsigned short paramC = 0;
              	unsigned short paramD = 0;
              
              	// Listage des Lecteurs
              	reponseFonction = obtenirInfos(paramA, listeParamB, &paramC, &paramD);
              
              	printf("Appuyez sur <Entree> pour fermer la fenetre...");
              	caracSortieProg = getchar();
              }

              En en lançant ce code j'obtiens toujours la même erreur.
              Et comme vous l'avez si bien dit cette erreur ressemble à un pointeur non initialisé. J'ai donc regardé du côté des traces de Debug (je suis sur Visual Studio Community 2017 que je découvre).
              Et il semble qu'avec ce nouveau code, mes variables sont correctes non..? (même sans passer par un malloc non...?)

              • Partager sur Facebook
              • Partager sur Twitter

              Heureux les fêlés car ils laissent passer la lumière...

                15 juillet 2019 à 10:16:02

                Tu parles dans ton premier message de la définition de ta fonction. Hors tu nous montres sa déclaration.

                Il me semble voir que l'adresse de cette fonction est égale à 0x00000000, ce qui expliquerait le message d'erreur. Du coup, où se trouve la définition de cette fonction car je ne la vois nulle part?

                • Partager sur Facebook
                • Partager sur Twitter
                  15 juillet 2019 à 10:33:18

                  La définition de la fonction est dans un fichier .h (fourni par le constructeur).
                  Et j'ai également à ma disposition un fichier .lib (fourni par le constructeur également). Et si j'ai bien compris ce fichier lib est une bibliothèque statique déjà compilée (dans lequel se trouve le code compilé de la fonction).
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Heureux les fêlés car ils laissent passer la lumière...

                    15 juillet 2019 à 11:08:41

                    As-tu bien inclus la librairie dans ton projet afin de la linker?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 juillet 2019 à 11:26:14

                      Je me suis posé cette question en effet. Et je me suis dit que l'erreur pouvait peut-être venir de là.
                      J'ai donc revu toute la configuration de mon Projet (sous Visual Studio) et tout est correct (puisque si je modifie le nom de la lib dans la config avec un faux nom j'obtiens bien une erreur de chargement de fichier).

                      Afin d'être plus clair je vous communique ci-dessous l'extrait (modifié) de la doc d'une fonction.
                      Elle est plus simple que la précédente et pourtant j'obtiens la même erreur de violation d'accès.


                      Et ci-dessous le code que j'ai inséré dans mon projet

                      #define _WINDOWS
                      #define WIN64
                      
                      #include <stdio.h>
                      #include <stdlib.h>
                      #include "win32def.h"
                      #include "api_lec.h"
                      #include "api_err.h"
                      
                      
                      
                      int main(void)
                      {
                      		// Déclarations Variables
                      		char caracSortieProg = 0;
                      		unsigned short reponseFonction = 0;
                      		unsigned char chemin[] = "C:\\XXXXXXX\\";
                      		unsigned char nomRessourceA[] = "lecA";
                      		unsigned char nomRessourceB[] = "lecB";
                      		unsigned short codeErreur = 0;
                      
                      
                      
                      		// Initialisation des Appareil
                      		reponseFonction = initialiserAppareil(chemin, nomRessourceA, nomRessourceB, &codeErreur);
                      
                      		printf("Appuyez sur <Entree> pour fermer la fenetre...");
                      		caracSortieProg = getchar();
                      }


                      Aurais-je mal compris la documentation (et le langage C)...? Et mes variables seraient-elles donc mal définies et/ou mal initialisées..?

                      -
                      Edité par Juanito de Dironne 15 juillet 2019 à 12:03:33

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Heureux les fêlés car ils laissent passer la lumière...

                        15 juillet 2019 à 19:04:01

                        Telles quelles, tes variables dans le main() m'ont l'air bien initialisées et le passage en paramètre m'a aussi l'air bien.

                        A mon avis, le vrai problème c'est comment tu manipules ces paramètres dans initialiserAppareil().

                        Peut-on avoir quelques parties de code où tu utilises ces paramètres ?

                        La violation d'accès peut survenir si tu cherches à lire à un endroit interdit d'accès en mémoire, donc peut être qu'à un moment tu modifies un pointeur à 0 sans le vouloir, puis tentes d'y faire quelque chose (ce qui est impossible car 0=>NULL, donc accès illicite).

                        initialiserAppareil() vient de laquelle de tes libs personnelles ?

                        Essaies de voir quelle ligne provoque l'erreur aussi. C'est un peu brutal mais parfois, pour m'en sortir, je fais un printf() avant la ligne que je suspecte et je m'en tire bien. Comme ça si j'ai le message de ce printf() c'est que mon erreur arrive plus tard, sinon c'est que j'ai mon erreur avant !

                        Ta doc' explique bien le dessous, j'ai rien à ajouter pour ça ^^. Tout m'a l'air complet, il faut juste avoir plus de détails en interne pour t'apporter la meilleure aide possible.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 juillet 2019 à 0:20:57

                          Note: Tu peux aussi utiliser un debuggueur pour savoir où ton programme plante :)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 juillet 2019 à 9:04:51

                            Encore une fois grand merci pour vos réponses :)

                            Alors la fonction initialiserAppareil() fait partie des fonctions fournies par le constructeur. J'ai un fichier lib ainsi que plusieurs fichiers h.

                            Et si j'ai bien compris le fichier lib est un fichier dont le code est déjà compilé c'est bien ça...?
                            Donc je ne peux accéder au code source de cette fonction c'est bien cela...?

                            Et pour le Debuggueur, je suis sous Visual Studio Community 2017. Mais si le problème vient bien de la fonction incluse dans le fichier .lib pourrais-je voir quelque chose avec le Debuggueur...? J'avais déjà montré ça

                            Mais je pourrais en savoir plus...? Même si la fonction est dans un fichier lib...?
                            Cette capture est liée à l'appel d'une autre fonction que initialiserAppareil mais j'obtiens exactement la même erreur de violation d'accès.

                            -
                            Edité par Juanito de Dironne 16 juillet 2019 à 9:06:30

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Heureux les fêlés car ils laissent passer la lumière...

                              16 juillet 2019 à 17:58:33

                              Hello,

                              Tu parles d'une librairie constructeur, mais si j'ai bien parcouru toute la discussion, tu ne dis pas laquelle, et tu ne fournis aucun lien vers le manuel de cette lib. Comment savoir si tu appelles correctement initialiserAppareil() ?

                              • Partager sur Facebook
                              • Partager sur Twitter

                              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                16 juillet 2019 à 18:27:08

                                Comment fais tu pour avoir un nom fictif pour ta variable dans la liste de visual studio alors que tu dis que ta fonction ne se nome différemment ?

                                Le fichier LIB est bien pour Visual C, tu ne fait pas un mélange 32 ou 64 bits ? 

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 juillet 2019 à 6:30:57

                                  Je ne vais pas vous mentir là-dessus, je galère à utiliser des débogueurs. Cependant la seule zone qui me fait penser à une "violation d'accès" est la valeur de obtenirInfos() (qui est 0x00000000). C'est peut être bien parce qu'elle n'est pas détectée correctement. J'utilise codeblocks alors je sais pas si ça a une quelconque influence, mais essaies de mettre des chevrons <> plutôt des des guillemets "" pour l'inclusion de tes .h.

                                  D'ailleurs, obtenirInfos() et initialiserAppareil() viennent de quelle(s) libs ? Je crois avoir compris que tes libs ne sont ni des libs personnelles, ni des libs standards (donc que tu n'as pas accès à leurs codes). A la vue des parties de doc' que tu nous as fournis, je persiste à dire que ton code m'a l'air correct et que c'est plutôt au niveau de la mise en place que quelque chose ne va pas. Sinon c'est une lib 64 bits et ton ordinateur est 32 bits... Niveau matériel je n'y connais pas grand chose mais j'ai déjà eu un problème avec la SDL2 de ce genre, on sait jamais.

                                  Par contre il me semble qu'une lib 32 bits marche sur une machine 64 bits.

                                  Dernière chose : il y a des descriptions sur tout sauf sur la fonction en elle-même. Leurs noms sont déjà parlants, mais pour s'en assurer as-tu une description de ce qu'elles doivent faire ?

                                  Désolé de ne pas avoir encore trouvé la solution, j'avoue être un peu dans le flou. J'espère que cette fois ça va le faire !

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 juillet 2019 à 10:27:37

                                    Le constructeur a peut être fourni des exemples d'utilisation de sa bibliothèque ? Partir d'un source dont on sait qu'il doit marcher, ça fait gagner du temps, au moins pour vérifier la mise en place (options de compilation, bibliothèques...)

                                    *Un truc au passage : ne déclarer une variable qu'à l'endroit où on s'en sert. Ça évite

                                    • la pollution (trimballer une variable dont on n'a rien à carrer pendant 10 lignes)
                                    • d'y mettre n'importe quoi en attendant
                                    int main(void)
                                    {	                 
                                    		unsigned char chemin[] = "C:\\XXXXXXX\\";
                                    		unsigned char nomRessourceA[] = "lecA";
                                    		unsigned char nomRessourceB[] = "lecB";
                                    		unsigned short codeErreur = 0;
                                    
                                    		// Initialisation des Appareil
                                    		unsigned short reponseFonction = initialiserAppareil(chemin, nomRessourceA, nomRessourceB, &codeErreur);
                                    
                                    		printf("Appuyez sur <Entree> pour fermer la fenetre...");
                                    		char caracSortieProg = getchar();
                                    }

                                    -
                                    Edité par michelbillaud 17 juillet 2019 à 10:38:20

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 juillet 2019 à 15:45:28

                                      Encore une fois merci pour le temps passé et vos réponses.

                                      edgarjacobs
                                      Je ne peux pas fournir de document officiel mon fournisseur de matériel me l'interdit.
                                      J'ai donc copié la documentation en changeant le nom de la fonction et des paramètres.

                                      rouloude
                                      Les noms fictifs ne sont pas le code officiel. J'ai repris le code et juste changé les noms avant de poster sur le Forum.

                                      yaranorgoth
                                      J'ai effectivement pensé au problème de compatibilité 32 Bits et 64 Bits. Mais en modifiant mon Projet sous Visual Studio, rien n'y fait j'ai la même erreur (avec bien sur une différence avec l'adresse 0x0000 plus grande en 64 que 32 :) )

                                      michelbillaud
                                      Je pensais qu'il était préférable de bien identifier ces variables en début de code.
                                      Ensuite, pour la lecture, je ne pensais pas que ça pouvait polluer le code puisque ensuite on n'avait plus de déclarations de variables mais juste de ""l’exécution de code"". Et ça permettait de bien identifier les variables utilisées dans le code aussi

                                      -
                                      Edité par Juanito de Dironne 17 juillet 2019 à 18:26:20

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Heureux les fêlés car ils laissent passer la lumière...

                                        18 juillet 2019 à 8:36:40

                                        Déclarer une variable ligne 15 et lui affecter la valeur 0 ne permet pas d' "identifier" qu'elle n'est utilisée que ligne 28.

                                        Sa portée laisse croire qu'elle a une utilité dans tout le code qui suit. Ce qui n'est pas le cas.

                                        Quand on développe et qu'on relit le programme, il y a deux parties : faire marcher l'appareil, et fermer le programme a la fin.

                                        Mélanger les variables des deux introduit une complication : il faut lire tout le code pour savoir que la variable ne sert qu'a la seconde partie. C'est ça la pollution.

                                        Une bonne solution serait de faire une fonction fermer_programme(), avec sa variable locale qui n'embetera personne.

                                        -
                                        Edité par michelbillaud 18 juillet 2019 à 8:46:01

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          18 juillet 2019 à 9:18:45

                                          Merci michelbillaud

                                          Je débute en C et je n'avais pas d'emblée créé de fonction quand j'ai montré ce code mais depuis c'est fait.
                                          Et ce afin d'avoir une lecture plus claire possible du code (et aussi parce que cette fonction est amenée à être utilisée à différents endroits).

                                          Pour ce qui est de l'erreur de violation, j'ai contacté le fournisseur des libraires car à force de chercher je commence par croire que le problème est due à la librairie, enfin à la fonction présente dans cette librairie.

                                          -
                                          Edité par Juanito de Dironne 18 juillet 2019 à 10:49:55

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Heureux les fêlés car ils laissent passer la lumière...

                                            18 juillet 2019 à 10:54:14

                                            Salut,

                                            J'y avais pensé et j'ai oublié de l'écrire dans mon précédent message : en effet comme tu l'as toi-même dit dans ton dernier message, l'erreur peut aussi venir du code de la lib en elle-même ! Même si en général ça n'est pas le cas parce que les codes des libs sont testés, il faut le dire, ce cas est possible pour plusieurs raisons : la portabilité n'est pas respectée, une mauvaise version de la lib a été prise ou donnée, il y a une erreur imprévue dans le code...

                                            Bref : c'est assez complexe de t'aider pour l'instant, il faudra en effet attendre la réponse du fournisseur pour s'assurer de la suite. Sinon, tu peux peut être changer de lib (même si je me doute que tu n'as peut être pas la permission).

                                            Si tu n'as pas de code d'exemple sur le net ou de la part de ton fournisseur pour savoir comment on utilise la lib ça risque d'être compliqué...

                                            En espérant que la réponse nous parvienne.

                                            A plus.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 juillet 2019 à 15:03:44

                                              Bon j'ai finalement posé la question à mon fournisseur pour savoir si le code (que j'ai écrit) et la bibliothèque qu'il m'avait fourni est bien correcte.

                                              Je donnerai les résultats ici des que possible :)

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Heureux les fêlés car ils laissent passer la lumière...

                                                19 juillet 2019 à 15:08:20

                                                Faut lui préciser aussi les versions du système et du compilateur utilisés. On n'est jamais à l'abri de surprises et d'incompatibilités.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  21 juillet 2019 à 8:16:21

                                                  Exact ! Comme je le disais, il est plus probable que le problème vienne de la non-portabilité du code. Qui te dit que la bibliothèque n'est pas pour du linux seulement ? Si t'es sous windows... c'est mort. N'hésite pas à leur dire sous quel OS tu travailles. Il me semble aussi que certains codes avec visual studios ne réagissent pas pareil sous codeblocks.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    21 juillet 2019 à 8:23:09

                                                    C'est pas une histoire d'ide, mais des outils utilisés en dessous : compilateur et éditeur de liens. 

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      22 juillet 2019 à 10:25:31

                                                      J'ai en effet communiqué ces informations au Constructeur et c'est lui qui m'a fourni (en fonction de mon OS qui est Windows) la bonne librairie.
                                                      Et même en fonction de l'architecture puisqu'il ma fourni une version 64 Bits.
                                                      Ensuite j'avais posé la question lors de mes premiers échecs pour savoir si la librairie fournie était compatible MingW (ce que j'utilisais) ou "Studio".

                                                      La réponse a été que la librairie avait été compilée avec Studio.
                                                      Alors plutôt que de paramétrer CodeBlocks (pour créer un projet compatible) j'ai donc utilisé Visual Studio afin d'éliminer au maximum les causes d'erreurs possible.

                                                      Mais comme vous le voyez l'erreur est là. Le courrier est parti vendredi. J'espère avoir une réponse et vous tiens au courant.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Heureux les fêlés car ils laissent passer la lumière...

                                                        22 juillet 2019 à 10:38:30

                                                        Il reste d'autres possibilités. Un grand classique,  accuser la bibliothèque, le compilateur, les rayons cosmiques et la maffia russe, alors qu'on a simplement fourni de mauvais paramètres à la fonction (ou pas les bons droits d'accès etc).

                                                        Aboyer au pied du mauvais arbre, ça s'appelle. Ca arrive souvent.

                                                        PS : pour la remarque initiale

                                                        > J'obtiens toujours la violation d'accès. Mais dans la fenêtre du Debugger, j'ai 0x0000000 comme valeur pour la fonction obtenirInfos

                                                        je ne vois de contradition : la fonction appelée fait des trucs, se plante et son "return" n'est jamais exécuté : reponseFonction contient toujours 0.

                                                        -
                                                        Edité par michelbillaud 22 juillet 2019 à 10:47:26

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          22 juillet 2019 à 10:54:06

                                                          Tu appelles bien la fonction, tu ne passes pas par un pointeur de fonction (initialisé à NULL) ?

                                                          michelbillaud a écrit:

                                                          alors qu'on a simplement fourni de mauvais paramètres à la fonction

                                                          Passer un mauvais paramètre n'explique pas pourquoi la fonction est à l'adresse 0.



                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            22 juillet 2019 à 11:55:17

                                                            michelbillaud je n'ai pas l'impression d'accuser bêtement (référence au chien qui aboie) la bibliothèque.
                                                            J'ai cherché avant d'écrire sur ce forum et continuer encore et encore à chercher.
                                                            J'ai remis en cause mon code car c'est la plus élémentaire des choses à faire. Puis j'ai partagé ici une documentation de la fonction ainsi que du code pour montrer comment étaient initialiser mes variables.

                                                            Et ma remarque sur le Debugger a peut-être été mal formulée, je voulais juste montrer que mes variables étaient apparemment bien initialisées mais que l'erreur semblait venir du traitement effectué par la fonction.

                                                            J'ai continué à développer avec d'autres bibliothèques fournies par le constructeur. Mais des DLL cette fois et j'arrive à obtenir des résultats.
                                                            Le développement avec les librairies statiques LIB ne fonctionne toujours pas.
                                                            A force de chercher, de poser des questions ici, suite aux échanges et après m'être remis maintes fois en cause j'ai supposé que le problème pouvait venir de la bibliothèque. Je me trompe peut-être certes. Certes mais j'estime avoir procédé de manière empirique avant d'en arriver là.

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Heureux les fêlés car ils laissent passer la lumière...

                                                              22 juillet 2019 à 12:23:29

                                                              Juanito de Dironne a écrit:

                                                              michelbillaud je n'ai pas l'impression d'accuser bêtement (référence au chien qui aboie) la bibliothèque.

                                                              Note: c'est pas du tout une attaque, c'est un phénomène qui se produit quand on est dans la phase initiale d'utilisation d'un truc qu'on ne connait pas, et qui n'a pas eu le bon goût de fonctionner du premier coup. En fait on ne comprend pas tous les éléments qui interviennent, et quand ça marche pas on ne sait pas au pied de quel arbre il faut aboyer.

                                                              C'est pour ça, par exemple, qu'on fait taper des exemples "hello world" pour commencer à apprendre un langage (*)(**). Ca permet au moins de voir comment saisir, compiler et faire exécuter. Si ça fonctionne, on sait déjà qu'on a sous la main tous les outils qu'il faut, et en état de marche.

                                                              > mes variables étaient apparemment bien initialisées mais que l'erreur semblait venir du traitement effectué par la fonction.

                                                              Il n'y a aucune raison rationnelle qu'une variable déclarée et initialisée dans la foulée soit mal initialisée, techniquement. Après peut être que la chaine de caractères donnée en paramètre est un chemin incorrect, inexistant, ou menant à un dossier protégé.

                                                              Pour savoir si le crash a lieu dans la fonction, c'est pas compliqué : un printf/scanf ou un point d'arret sur l'instruction qui suit l'appel. Si ça plante avant d'en arriver la, c'est la fonction qui plante.

                                                              (*) Un exemple de truc piégeux, les Makefiles, dont on ne remarque pas bien, quand lit trop vite (ou pas du tout) la doc, que les lignes de commandes commencent par des tabulations et pas des espaces.

                                                              (**) je me rappelle que les premieres fois où j'ai voulu programmer un truc en Algol (il y a plusieurs décennies), j'ai utilisé par mégarde la commande de compilation pour Fortran, et j'ai mis très longtemps à comprendre pourquoi le compilo trouvait autant d'erreurs, parce que je ne cherchais pas du tout le problème de ce côté

                                                              -
                                                              Edité par michelbillaud 22 juillet 2019 à 12:31:12

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Violation Accès 0x000000

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown