l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Débutant en C : tous les problèmes en même temps...

Sun Jul 21, 2013 3:34 pm

Il m'est arrivé, il y a longtemps, et pour pas longtemps, d'écrire des programmes en C. Ça m'a laissé peu de souvenirs, sauf que la manipulation de chaines de caractères, c'est complètement incompréhensible !

Et ça recommence ! Avec les #include qui vont bien, j'ai

Code: Select all

char *Une = "Une";
char Chaine[64];
strncpy(Chaine, Une, 1);
Chaine[1]='\0';
...
qui compile nickel, mais à l'exécution, j'ai "Segmentation error" !

Je crois bien avoir essayé toutes les combinaisons de '&' et '*' (sans essayer de comprendre) devrant Chaine et Une dans strncpy : ça compile pas !

Rien de ce que j'ai pu trouver chez mon ami Google ne m'a aidé !

Alors merci à qui voudra bien essayer de m'expliquer encore une fois....

AMIcalement.
Last edited by l'AMI Yves on Tue Jul 23, 2013 7:03 am, edited 1 time in total.

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Débutant en C : chaines de caractères

Mon Jul 22, 2013 3:04 pm

Salut Yves , as tu regardé de ce coté ? : http://www.siteduzero.com/informatique/ ... caracteres (en particulier "fonctions de manipulation des chaines")

mifasol
Posts: 16
Joined: Mon Jun 24, 2013 1:51 pm

Re: Débutant en C : chaines de caractères

Mon Jul 22, 2013 3:26 pm

Je n´arrive pas à reproduire le ¨Segmentation error¨.

Code: Select all

// compilation: gcc -Wall test.c -o test
#include <stdio.h>
#include <string.h>
int main()
{
	char *Une = "Une";
	//~ char Une[] = "Une";
	char Chaine[8];
	strncpy(Chaine, Une, 1);
	//~ memcpy(Chaine, Une, 1);
	Chaine[1]='\0';
	puts (Chaine);
	return 0;
}
Exécution sans problème:
U
(program exited with code: 0)

l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Re: Débutant en C : chaines de caractères

Mon Jul 22, 2013 4:27 pm

Il est tout à fait possible que l'erreur soit ailleurs... J'essaie d'écrire une IHM avec GTK, et je suis en train de mettre en œuvre des fonctions callback pour la gestion d'événements... C'est bien obligé d'aborder plus ou moins toutes les difficultés en même temps, quand on débute...

J'essaie de ne pas surcharger ma pauvre Framboise en installant des paquets en pagaille. Comme IDE, j'ai installé geany. J'ai essayé d'installer le plugin debugger, mais, ou bien j'ai sauté une marche, ou bien ça ne change pas grand chose : j'aurais souhaité qu'il me dise un truc du genre "Erreur truc à la ligne tant de tel module", voire qu'il m'ouvre l'éditeur en pointant ladite ligne, mais je n'ai pas obtenu ce résultat. Faut-il des options spéciales dans le makefile ?

Pour le moment, je cherche est l'erreur : quand j'aurai trouvé, je modifierai le titre de mon post (pour changer...)

Je vais aller regarder le lien proposé sur les chaînes de caractère, mais j'en ai déjà regardé beaucoup : il me manque simplement le réflexe approprié pour choisir entre rien, ou "*" ou "&" : je ne sais pas si je le trouverai dans un tutoriel.
[Edit] oui, j'y suis déjà passé plusieurs fois. Merci.

AMIcalement

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Débutant en C : chaines de caractères

Mon Jul 22, 2013 4:42 pm

Yves , je ne comprend pas pourquoi faire une IHM du coté framboise , c'est pas mieux de la faire coté "telecommande" car c'est par la que l'Homme agit (donc qu'il faut une interface) et de laisser la framboise tranquille sans X , enfin la laisser juste en mode console (histoire de justement pas la surchargée) et lui mettre juste un system de socket pour communiquer (envoyer et optionellement recevoir des infos qui serviraient coté telecommande) ?

mifasol
Posts: 16
Joined: Mon Jun 24, 2013 1:51 pm

Re: Débutant en C : chaines de caractères

Mon Jul 22, 2013 5:28 pm

Pour debugger, il y a le paquet ddd (et ddd-doc), je n´ai jamais essayé le debbuger de geany.
Sinon il est toujours possible de debugger uniquement via des messages vers stdout...

totoharibo
Posts: 4437
Joined: Thu Jan 24, 2013 8:43 am

Re: Débutant en C : chaines de caractères

Mon Jul 22, 2013 7:31 pm

le debugger de geany utilise gdb le debugger de GNU.

Pas essayé non plus.

J'ai utilisé autrefois ddd (sur PC) : lourd mais pas mal.

sinon xxxgdb : pas testé non plus

l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Re: Débutant en C : chaines de caractères

Mon Jul 22, 2013 10:10 pm

@ToOnS
Comme je l'ai dit et répété, je suis débutant en Linux et en C (et en je ne sais plus quoi, d'ailleurs) et je pèche partout toutes les informations qui passent - d'ailleurs il y en a des tonnes que je me souviens d'avoir vu, mais je ne sais plus où...

Pour l'IHM, j'ai lu que le standard Linux, c'est X11, qui est client-serveur : une partie sur le RPi, une partie sur le PC (je ne sais plus où est le client, où le serveur). Et, en effet, pour afficher mon "Hello world" sur le PC, il a fallu que j'installe je ne sais plus quoi dessus. Après, j'ai lu que pour développer une IHM sous X11, il y avait GTK, alors je suis parti là-dessus, mais s'il y a mieux à faire, je suis d'accord pour apprendre.

Ouais... avec un bémol ! Je ne sais pas si c'est l'âge, mais en ce moment, j'ai beaucoup à apprendre, ça se bouscule au portillon et ça n'entre pas terrible !

Ce que j'ai déjà fait marcher, c'est une connexion SSH avec activation de je-ne-sais-plus-quoi concernant X11 avec une clé WiFi sur un réseau en mode Ad-Hoc. Par cette connexion SSH, je lance mon exécutable "Hello", et la fenêtre Hello World s'ouvre sur le PC.

Ce que je veux faire maintenant, c'est une fenêtre plus élaborée, avec des labels sur le PC qui indiquent des informations de RPi, et des boutons ou des ascenseurs sur le PC, qui modifient des valeurs de variables du programme dans le RPi, à partir desquelles je génère des largeurs d'impulsions PWM, ou des états des sorties du RPI;

Si vous pensez que je n'utilise pas d'assez bons outils, merci de m'indiquer - de façon très explicite, je suis débutant ! - quels outils sont mieux adaptes, quels paquetages il faut installer, et où trouver le manuel d'utilisation (et si en plus il pouvait être en français, j'aurais l'impression de me reposer un peu !)

Merci.

AMIcalement.

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Débutant en C : chaines de caractères

Tue Jul 23, 2013 12:04 am

Justement si je demande l'interet de faire une IHM sur la framboise (d'ailleur j'avais pas compris mais c'est apperement sur PC que tu essais) c'est pour eviter que tu utilises linux et le C mais une plateforme dans laquelle tu te sens a l'aise.
par exemple windows et visual basic

coté RPI un serveur socket , ca se code facilement y'a des tuto partout sur google pour faire ca sous linux :

Code: Select all

/* A simple server in the internet domain using TCP
   The port number is passed as an argument */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
     int sockfd, newsockfd, portno;
     socklen_t clilen;
     char buffer[256];
     struct sockaddr_in serv_addr, cli_addr;
     int n;
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     newsockfd = accept(sockfd, 
                 (struct sockaddr *) &cli_addr, 
                 &clilen);
     if (newsockfd < 0) 
          error("ERROR on accept");
     bzero(buffer,256);
     n = read(newsockfd,buffer,255);
     if (n < 0) error("ERROR reading from socket");
     printf("message: %s\n",buffer);
     n = write(newsockfd,"Hey Yves je suis ta framboise j'ai bien recu ton message",55);
     if (n < 0) error("ERROR writing to socket");
     close(newsockfd);
     close(sockfd);
     return 0; 
}
a lancer comme ca : ./server 8888

voila coté framboise c'est reglé plus besoin d'y retourner (en fait si pour traiter les infos recues pour faire tourner les moteurs mais l'idée est la) pas besoin de GTK ou je sais pas quoi ni de "startdux" , au revoir la surcharge , on oubli linux et le C

et coté Windows un client socket (pareil y'a des tutos partout)
la c'est en vb.net (visual basic express est gratuit) mais on peu le faire dans n'importe quel langage , celui qui te convient le mieux
juste changer l'ip par celle de la framboise dans la fonction Button2_Click a la place de 127.0.0.1:

Code: Select all

Imports System.Net.Sockets
Imports System.Text
Public Class Form1
    Dim clientSocket As New System.Net.Sockets.TcpClient()
    Dim serverStream As NetworkStream
    Dim readData As String
    Dim infiniteCounter As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
        Dim outStream As Byte() = _
        System.Text.Encoding.ASCII.GetBytes(TextBox2.Text + "$")
        serverStream.Write(outStream, 0, outStream.Length)
        serverStream.Flush()
    End Sub

    Private Sub msg()
        If Me.InvokeRequired Then
            Me.Invoke(New MethodInvoker(AddressOf msg))
        Else
            TextBox1.Text = TextBox1.Text + _
			 Environment.NewLine + " >> " + readData
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button2.Click
        readData = "Conected to Chat Server ..."
        msg()
        clientSocket.Connect("127.0.0.1", 8888)
        'Label1.Text = "Client Socket Program - Server Connected ..."
        serverStream = clientSocket.GetStream()

        Dim outStream As Byte() = _
        System.Text.Encoding.ASCII.GetBytes(TextBox3.Text + "$")
        serverStream.Write(outStream, 0, outStream.Length)
        serverStream.Flush()

        Dim ctThread As Threading.Thread = _
		 New Threading.Thread(AddressOf getMessage)
        ctThread.Start()
    End Sub

    Private Sub getMessage()
        For infiniteCounter = 1 To 2
            infiniteCounter = 1
            serverStream = clientSocket.GetStream()
            Dim buffSize As Integer
            Dim inStream(1024) As Byte
            buffSize = clientSocket.ReceiveBufferSize
            serverStream.Read(inStream, 0, buffSize)
            Dim returndata As String = _
            System.Text.Encoding.ASCII.GetString(inStream)
            readData = "" + returndata
            msg()
        Next
    End Sub
End Class
pour infiniteCounter c'est du n'importe quoi mais ca marche (surement trop simple de mettre un while)
ou a telecharger ici (comme ca y'a deja les boutons , textbox et tout le bordel visuel) : http://vb.net-informations.com/communic ... client.zip

la ca envoie des chaines de caracteres des 2 cotés pour que ca soit plus visuel mais rien empeche (au contraire c'est mieux) d'envoyer des bytes a la place du genre :
0x01 = moteur
0x02 = gouvernail
et envoyer par paquet de 2 bytes (c'est plus rapide que d'envoyer une chaine de X caracteres et ca simplifie pour les boucles de reception car on sait qu'on va recevoir 2 bytes et pas X caracteres , en plus c'est cool pas besoin de chercher comment ca marche les chaines de caracteres) , le 2ieme etant la vitesse ou l'angle pour donner un truc comme ca :
0x01 0xFF // moteur pleine vitesse
0x01 0x80 // moteur a l'arret
0x01 0x40 // moteur a mi vitesse en marche arriere
0x02 0x80 // gouvernail tout droit
0x02 0xFF // gouvernail a fond a droite
0x02 0x00 // gouvernail a fond a gauche
0x02 0x40 // gouvernail a moitié a gauche
etc
bon allez meme un 3ieme byte qui serait un checksum histoire de verifier que y'a pas un bit de perdu en route

la c'est un serveur socket (parceque j'aime mieux , y'a rien a configurer) mais on peu tres bien appliquer le meme principe avec un serveur web (plutot php) histoire que ca marche avec le dernier iphone 8 gts turbo sans a avoir a le jailbreaker pour installer une appli client socket home made (parceque apple c'est des vilains qui bloquent tout mais ils ont raison , leurs clients adorent ca jusque dormir dans des tentes 3 jours avant la sortie de la pomme empoisonnée , peu etre que je m'egare un peu la)

l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Re: Débutant en C : chaines de caractères

Tue Jul 23, 2013 7:02 am

Merci, ToOnS !

Bon, enfin, je ne sais plus quoi penser : je devrais changer le titre de ce topic : "Débutant en C : comment éluder les problèmes". C'est vrai, quoi, tu viens me proposer sur un plateau un truc qui répond certainement à mon cahier des charges (j'ai pas encore approfondi, mais c'est sûr), mais qui me casse complètement quasiment tout ce que j'avais prévu.

C'est sûr que je pestais comme malade contre le mal que j'avais à tailler ma route au milieu de toute l'information que je trouvais sur les packages, sur les IDE, sur les bibliothèques, sur les tutoriels : il y a tout et n'importe quoi, ça tire dans tous les sens, mais enfin, j'apprenais le monde Linux ! Ben c'est pas la peine !

Je reviens dans le monde PC. Tu me proposes vb.net. Bon, là, ça va pas le faire : je fais partie de ces Cro-Magnons qui n'en démordent pas de VB6. Le principe du "framework" m'a toujours donné des boutons, et je suis sur que le petit truc que tu m'indiques va faire un exécutable de plusieurs megas, qu'il va falloir installer sur tous les PC qui voudront jouer avec etc...

Mais je vais surement savoir le faire en VB6, c'est pas un problème (enfin... j'espère), vu ce que j'ai déjà fait dans ce domaine.

Pour le moment, l'important, c'est que mon bateau aille sur l'eau ! Pour le reste, j'y reviendrai, c'est sûr.

Alors, encore merci, et... à bientôt, pour des questions sur les sockets, par exemple...

AMIcalement.

laurent
Posts: 341
Joined: Thu Jul 26, 2012 11:24 am

Re: Débutant en C : tous les problèmes en même temps...

Tue Jul 23, 2013 8:35 am

Salut,

Effectivement, ton architecture initiale me paraît peu adaptée.
X11 est un système d'affichage client-serveur, utilisant un protocole (X) qui permet d'afficher sur le client l'application graphique lancée sur le serveur (https://fr.wikipedia.org/wiki/X_Window_System).
Dans une distribution Linux classique (Ubuntu, Debian, Fedora, etc...), la grande majorité du temps (pour ne pas dire tout le temps), le client et le serveur tournent sur la même machine. Autrement dit, la machine qui exécute l'application est la même que celle qui l'affiche.

Dans ton architecture, tu prévois d'exécuter une application graphique qui contrôlera ton modèle, sur ton Rpi, et d'afficher cette application sur un PC, par affichage déporté.
Le protocole X étant relativement efficace, ce n'est pas tout l'environnement graphique qui est transféré image par image au PC, comme le ferait VNC par exemple, mais ce sont tout de même des informations d'affichage et d’interaction utilisateur (positionnement graphique d'éléments, de curseur, etc) qui seront envoyés du Rpi au PC.

Schématiquement, nous avons une interface sur un PC qui commande un modèle radiocommandé.
Logiquement, le besoin serait de transmettre, depuis cette interface, des actions relatives au contrôle du modèle (vitesse moteur, etc...) vers ce modèle.
Or dans cette architecture, tu commandes des actions relatives au contrôle graphique à distance d'une interface hébergée sur le modèle.
Le Rpi est donc surchargé à calculer l'interface à envoyer au PC, en plus de ses actions (contrôle des organes).

Donc idéalement, il faudrait envoyer juste les commandes "utiles" par un moyen de transport. Comme l'a dit ToOnS, les sockets sont parfaits vu le médium de communication utilisé.

L'avantage c'est que si ton soft est bien fait, les commandes qui passent par des sockets pourront passer par un autre moyen de communication (il existe des "modems radio" série avec une portée intéressante), sans refaire absolument tout, et en gardant la même interface sur PC ;)

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Débutant en C : tous les problèmes en même temps...

Tue Jul 23, 2013 2:43 pm

Yves faut pas avoir peur du framework (ca facilite beaucoup la vie) , il est deja dans tout les windows qui sont mis a jour , version 4 pour XP et 4.5 pour au dessus de XP mais le 4 suffit largement pour faire ce qu'on veut , le 4.5 apporte pas grand chose de plus donc si le programme est fait pour tourner sur un framework 4 il sera compatible sur tout les windows possible (bon sauf peu etre 3.1 et 98) sans rien a avoir a installer
j'ai pas compilé le programme pour verifier mais il doit pas depasser le demi Mo , je pense meme pas le quart de Mo (en tout cas ca tien sur une disquette pour ceux qui savent ce que c'est)
par contre je suis pas sur que les programmes vb6 sont compatibles avec les nouveaux comme windows 8 , y'a pas mal de bibliotheques qui ont sautées depuis

j'avais pas fait gaffe hier mais le serveur boucle pas , il attend un client , attend une reponse , renvoie un message et se ferme , faut juste le faire boucler histoire qu'il se ferme pas

l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Re: Débutant en C : tous les problèmes en même temps...

Sun Jul 28, 2013 8:55 am

Je réponds à ToOnS : je me suis lancé dans la programmation avec l'API Winsock, et si je ne reviens que maintenant, c'est qu'il m'a fallu tout ce temps pour assimiler (à peu près...?) les données qu'il fallait maîtriser pour le faire, puis réunir les données nécessaires - ce que je n'ai d'ailleurs encore fait qu'en partie : il semble impossible de trouver sur la toile un fichier à télécharger qui contiendrait les déclarations nécessaires pour utiliser ws2_32.dll en VB6 (comme je ne suis titulaire que de la licence "Initiation", je n'ai pas droit à winsock.ocx !)

Pour le serveur, j'ai recopié ton code et je l'ai compilé sur mon RPI. Je pense qu'il n'est pas complètement naze, puisqu'il m'engueule quand je le lance sans lui préciser de N° de port...

Pour le client, je suis arrivé à enchainer init, socket, bind, connect... mais là, je reçois l'erreur 10051 : destination unreachable.

Pour l'occasion, j'ai installé nmap (premier niveau des outils de hacking ?) pour regarder ce qui était ouvert sur mon Pi, et j'ai bien vu ce qui devait l'être (SSH, VNC, X11 et je ne sais plus quoi), mais pas le port que j'avais précisé.

[Edit] netstat sur le RPi me montre que le port spécifié est en attente : merci aux programmeurs expérimentés dans ce domaine de m'indiquer où chercher...

Je vais poursuivre mon chemin de croix, mais là, j'ai un coup de mou, et je viens rendre compte de mon (peu d') avancement.

A+

AMIcalement.

l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Re: Débutant en C : tous les problèmes en même temps...

Sun Jul 28, 2013 10:35 pm

La nuit porte conseil...

Ce matin, j'ai découvert que "network unreachable", ça allait vachement bien avec "erreur dans le codage de l'adresse", et, en y regardant de plus près, j'ai vu que je perdais le premier chiffre de chacun des 4 blocs. Pas étonnant que l'adresse 92.68... soit "unreachable !

Ce soir, j'envoie un message, et je sais que la réponse fait 55 caractères. Mais je n'ai pas encore la réponse. Ce sera pour demain.

A+

AMIcalement.

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Débutant en C : tous les problèmes en même temps...

Sun Jul 28, 2013 11:22 pm

Salut , Impeccable , la reponse fait bien 55 caractères , c'est : "Hey Yves je suis ta framboise j'ai bien recu ton message". :mrgreen: je pense que tu as plus qu'a transformer ce buffer de 55 octets (qui doivent etre en decimal 72 (H) , 101 (e),121 (y), 32 (espace) , 89 (Y) ...) en ascii avec un truc du genre :
' Convert bytes to string (rien a voir avec un voyage en tailand pour changer de sexe)
dim Reponse as string = StrConv(Data, vbUnicode) ' Data etant le tableau de 55 octets recus

ou de déjà passer a l'etape d'apres en utilisant tout simplement que des octets pour eviter les chaines de caractères , d'ailleur la reponse du RPI c'est juste pour voire comment faire pour envoyer de l'info vers le PC mais en realité dans ton projet tu n'as pas besoin de reponse (sauf si tu veux recuperer des chose comme la position GPS vers le PC , la charge de batterie ...)

l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Re: Débutant en C : tous les problèmes en même temps...

Mon Jul 29, 2013 2:30 pm

En fait, la réponse fait 56 caractères... Pour ne pas trop me prendre la tête, j'invente mon propre protocole, en caractères : la commande intéresse les domaines "H" pour Hello, "I" pour initialisation, "S" pour stop, et "0" pour la direction, "1" pour le moteur, "2" pour les feux, et c'est tout pour le moment. Le second caractère est (éventuellement) la valeur de la commande : plus à droit(gauche), plus(moins) vite, centre, zéro, avant/arrière etc... Le programme s'écrit avec des switch et des case, c'est facile et ça va assez vite.

J'ai en ce moment un problème (.C, .h, makefile, geany ?????) : dans le programme principal (socks.c), j'ai

Code: Select all

...
#include "bateau.h"
...
 char buffer[256]
...
Decode_Proto(buffer,n,Boucle);
...
Dans bateau.h, j'ai

Code: Select all

...
void Decode_Proto(char *buffer, int lbuff, inf Boucle);
et dans Decode_Proto.c :

Code: Select all

...
#include "bateau.h"
...
void Decode_Proto(char *Buffer, int lbuff, int Boucle)
{
...
}
La compilation me dit
socks.c:(.text+0x1f4): undefined reference to `Decode_Proto'


Si quelqu'un peut m'expliquer où est l'erreur...

Merci.

AMIcalement.

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Débutant en C : tous les problèmes en même temps...

Mon Jul 29, 2013 2:42 pm

ah oui 56 caractères , le dernier c'est /n (retour a la ligne)
dans .h , int , pas inf
void Decode_Proto(char *buffer, int lbuff, inf Boucle);

l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Re: Débutant en C : tous les problèmes en même temps...

Mon Jul 29, 2013 5:09 pm

Désolé, c'était une erreur de recopie : sur le RPi, il y a bien int

Merci quand même.

AMIcalement.

l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Re: Débutant en C : tous les problèmes en même temps...

Mon Jul 29, 2013 5:17 pm

Faut-il mettre quelque part une référence à bateau.h ou à Decode_Proto dans le makefile ?

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Débutant en C : tous les problèmes en même temps...

Mon Jul 29, 2013 7:09 pm

oui il faut referencer Decode_Proto , comme le hello.c ici : http://gl.developpez.com/tutoriel/outil/makefile/ et le .h aussi

l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Re: Débutant en C : tous les problèmes en même temps...

Tue Jul 30, 2013 6:48 am

Ah ben cette fois, mon titre est bien le bon !

Oui, j'ai mis les dépendances qui vont bien dans le makefile. Et ce qui devait arriver arriva : une avalanche d'erreurs.

Dans le fichier .h en question, je n'ai pas mis que le prototype de la fonction, j'ai aussi mis les déclarations de variables communes aux deux programmes (comme les déclarations de "commun" qu'on faisait en Fortran, dans le bon vieux temps).

Alors, je pense que c'est à l'édition de liens, pour chacune j'ai deux lignes d'erreur : d'abord "first declaration here", puis "multiple declaration of variable trucmuche".

Alors, comment fallait-il faire ? Je retourne à mes tutos !

AMIcalement.

l'AMI Yves
Posts: 128
Joined: Thu Jun 13, 2013 1:43 pm

Re: Débutant en C : tous les problèmes en même temps...

Tue Jul 30, 2013 6:09 pm

Je me réponds à moi-même, je crois qu'il y en a qui lisent ce que j'écris.

Il fallait déclarer les variables "communes" avec le "qualificatif" (?) extern dans le .h, et sans affecter de valeur, puis reprendre ces déclarations, en supprimant "extern" et en affectant éventuellement une valeur, dans l'un des programmes qui s'en servent.

Sur les forums, il y a grosse polémique à propos de cette façon d'utiliser les variables en C. Moi (qui suis de l'ancienne école !) je trouve que cette polémique n'a pas lieu d'être.

Voili-voilou.

AMIcalement.

Return to “Français”