Un bon logiciel gratos pour travailler en C ?

Callibistrys
2021-01-01 14:57:09

Le 01 janvier 2021 à 14:51:59 VegaVII a écrit :

Le 01 janvier 2021 à 14:49:04 Callibistrys a écrit :

Le 01 janvier 2021 à 14:46:23 VegaVII a écrit :

Le 01 janvier 2021 à 14:43:13 Callibistrys a écrit :

Le 01 janvier 2021 à 14:38:30 VegaVII a écrit :
D'ailleurs je profite de votre présence les connaisseurs
Je souhaite afficher une variable réelle grâce à un sprintf
sprintf("| %f |", *V[cpt_l][cpt_c]);

Je ne me rappelle plus comment on exploite la variable d'un tableau :hap:
J'ai bouffé du matlab pendant 1 mois donc j'ai des oublis :hap:

Si V est de type float**, alors il y a une astérisque en trop dans ton code.
Si il est unidimensionnel, c'est plutôt V[cpt_1*nb_colonnes + cpt_c]
Ou bien *(V + cpt_1*nb_colonnes + cpt_c) :hap:

C'est bien un tableau :oui:
mais quand j'enleve le ' * ' on me marque "incompatible type for argument 2 of sprintf "

sachant que la tableau a été déclaré float V[N][N] = {0};

EDIT : #define N 100

Normal, ta déclaration est foireuse en stricte C

Ah b​ouse :hap:

Est-ce que tu comprends au moins ce que fait sprintf ? :hap:
Je dis bien sprintf, pas printf :hap:

VegaVII
2021-01-01 14:59:26

Le 01 janvier 2021 à 14:57:09 Callibistrys a écrit :

Le 01 janvier 2021 à 14:51:59 VegaVII a écrit :

Le 01 janvier 2021 à 14:49:04 Callibistrys a écrit :

Le 01 janvier 2021 à 14:46:23 VegaVII a écrit :

Le 01 janvier 2021 à 14:43:13 Callibistrys a écrit :

Le 01 janvier 2021 à 14:38:30 VegaVII a écrit :
D'ailleurs je profite de votre présence les connaisseurs
Je souhaite afficher une variable réelle grâce à un sprintf
sprintf("| %f |", *V[cpt_l][cpt_c]);

Je ne me rappelle plus comment on exploite la variable d'un tableau :hap:
J'ai bouffé du matlab pendant 1 mois donc j'ai des oublis :hap:

Si V est de type float**, alors il y a une astérisque en trop dans ton code.
Si il est unidimensionnel, c'est plutôt V[cpt_1*nb_colonnes + cpt_c]
Ou bien *(V + cpt_1*nb_colonnes + cpt_c) :hap:

C'est bien un tableau :oui:
mais quand j'enleve le ' * ' on me marque "incompatible type for argument 2 of sprintf "

sachant que la tableau a été déclaré float V[N][N] = {0};

EDIT : #define N 100

Normal, ta déclaration est foireuse en stricte C

Ah b​ouse :hap:

Est-ce que tu comprends au moins ce que fait sprintf ? :hap:
Je dis bien sprintf, pas printf :hap:

Ah b​ouse maintenant que je réfléchis un peu c'est pas quand on souhaite rentrer une chaine de caracteres dans un tableau ? :rire:

Callibistrys
2021-01-01 15:03:52

Le 01 janvier 2021 à 14:59:26 VegaVII a écrit :

Le 01 janvier 2021 à 14:57:09 Callibistrys a écrit :

Le 01 janvier 2021 à 14:51:59 VegaVII a écrit :

Le 01 janvier 2021 à 14:49:04 Callibistrys a écrit :

Le 01 janvier 2021 à 14:46:23 VegaVII a écrit :

Le 01 janvier 2021 à 14:43:13 Callibistrys a écrit :

Le 01 janvier 2021 à 14:38:30 VegaVII a écrit :
D'ailleurs je profite de votre présence les connaisseurs
Je souhaite afficher une variable réelle grâce à un sprintf
sprintf("| %f |", *V[cpt_l][cpt_c]);

Je ne me rappelle plus comment on exploite la variable d'un tableau :hap:
J'ai bouffé du matlab pendant 1 mois donc j'ai des oublis :hap:

Si V est de type float**, alors il y a une astérisque en trop dans ton code.
Si il est unidimensionnel, c'est plutôt V[cpt_1*nb_colonnes + cpt_c]
Ou bien *(V + cpt_1*nb_colonnes + cpt_c) :hap:

C'est bien un tableau :oui:
mais quand j'enleve le ' * ' on me marque "incompatible type for argument 2 of sprintf "

sachant que la tableau a été déclaré float V[N][N] = {0};

EDIT : #define N 100

Normal, ta déclaration est foireuse en stricte C

Ah b​ouse :hap:

Est-ce que tu comprends au moins ce que fait sprintf ? :hap:
Je dis bien sprintf, pas printf :hap:

Ah b​ouse maintenant que je réfléchis un peu c'est pas quand on souhaite rentrer une chaine de caracteres dans un tableau ? :rire:

sprintf(str, fmt_str, ...)

C'est une fonction variadique (prend un nombre quelconque d'arguments (au moins 2)).
- Le premier est une chaine de caractères à remplir (la destination), de type char*. Tableau dont tu dois t'assurer qu'il existe et est de taille suffisante pour accueillir la chaine. Sans quoi, tu introduis une GIGANTESQUE faille dans ton code.
- Le deuxième est une chaine de formatage, qui correspond à ton "| %f |"
- La suite c'est les arguments par lesquels tu veux remplacer tes %f,%s,%d, etc. Il doit y avoir pile le bon nombre évidemment, sinon rebelotte, tu empiles des choses qui ne devraient pas être là et c'est encore plus facile d'exploiter ton code, ce qui est dramatique si ton binaire a les bonnes permissions (suid).

Dans ton cas, tu voulais seulement afficher un élément de ton tableau (dans stdout).
Donc printf(fmt_str, V[i][j]);

VegaVII
2021-01-01 15:08:02

Le 01 janvier 2021 à 15:03:52 Callibistrys a écrit :

Le 01 janvier 2021 à 14:59:26 VegaVII a écrit :

Le 01 janvier 2021 à 14:57:09 Callibistrys a écrit :

Le 01 janvier 2021 à 14:51:59 VegaVII a écrit :

Le 01 janvier 2021 à 14:49:04 Callibistrys a écrit :

Le 01 janvier 2021 à 14:46:23 VegaVII a écrit :

Le 01 janvier 2021 à 14:43:13 Callibistrys a écrit :

Le 01 janvier 2021 à 14:38:30 VegaVII a écrit :
D'ailleurs je profite de votre présence les connaisseurs
Je souhaite afficher une variable réelle grâce à un sprintf
sprintf("| %f |", *V[cpt_l][cpt_c]);

Je ne me rappelle plus comment on exploite la variable d'un tableau :hap:
J'ai bouffé du matlab pendant 1 mois donc j'ai des oublis :hap:

Si V est de type float**, alors il y a une astérisque en trop dans ton code.
Si il est unidimensionnel, c'est plutôt V[cpt_1*nb_colonnes + cpt_c]
Ou bien *(V + cpt_1*nb_colonnes + cpt_c) :hap:

C'est bien un tableau :oui:
mais quand j'enleve le ' * ' on me marque "incompatible type for argument 2 of sprintf "

sachant que la tableau a été déclaré float V[N][N] = {0};

EDIT : #define N 100

Normal, ta déclaration est foireuse en stricte C

Ah b​ouse :hap:

Est-ce que tu comprends au moins ce que fait sprintf ? :hap:
Je dis bien sprintf, pas printf :hap:

Ah b​ouse maintenant que je réfléchis un peu c'est pas quand on souhaite rentrer une chaine de caracteres dans un tableau ? :rire:

sprintf(str, fmt_str, ...)

C'est une fonction variadique (prend un nombre quelconque d'arguments).
- Le premier est une chaine de caractères à remplir (la destination), de type char*. Tableau dont tu dois t'assurer qu'il existe et est de taille suffisante pour accueillir la chaine. Sans quoi, tu introduis une GIGANTESQUE faille dans ton code.
- Le deuxième est une chaine de formatage, qui correspond à ton "| %f |"
- La suite c'est les arguments par lesquels tu veux remplacer tes %f,%s,%d, etc. Il doit y avoir pile le bon nombre évidemment, sinon rebelotte, tu empiles des choses qui ne devraient pas être là et c'est encore plus facile d'exploiter ton code, ce qui est dramatique si ton binaire a les bonnes permissions (suid).

Dans ton cas, tu voulais seulement afficher un élément de ton tableau (dans stdout).
Donc printf(fmt_str, V[i][j]);

Oui donc moi ce que je cherchais c''était le printf().

Par contre par curiosité tu as l'air d'avoir bien insisté sur le termes de failles.
Mais normalement le compilateur ne t'arrête pas pour te dire que la taille ne correspond pas ?

Callibistrys
2021-01-01 15:13:41

Le compilateur ne peut pas savoir ce que contiennent tes tableaux à l'éxécution. Là il te prévient parce qu'il y a très visiblement un problème entre char* et float*, mais si V avait été un tableau de chaines de caractère ne contenant pas de succession de '%' en nombre impair, le code aurait continué et aurait fait de la merde sans rien te dire.

Prends par exemple le code


int t[1] = {0x61636163};
printf("%s\n", (char*)t);

et dis moi ce que ça t'affiche :hap:
Ca c'est pour les données.

Callibistrys
2021-01-01 15:16:32

Pour la taille, il faut avoir quelques notions d'assembleur (ou comprendre comment la mémoire est allouée) et je ne veux pas t'embrouiller, mais en gros si tu contrôles pas la taille, tu autorises l'attaquant à écrire autant de choses qu'il veut dans ta RAM. Il va la remplir avec de la merde inutile, jusqu'à ce qu'il ait atteint l'endroit où est mémorisée l'adresse de retour de ta fonction main, et la remplacer par une autre adresse, qui pointe vers du code malicieux.
Quand ta fonction main aura fini de s'éxécuter, elle va sauter silencieusement vers le code malicieux. Owned :noel:
Et s'il a accès au code source en plus, il peut s'arranger pour que ça ne crashe pas et que tu ne te rendes pas compte de ce qu'il s'est passé :noel:

VegaVII
2021-01-01 15:18:10

Le 01 janvier 2021 à 15:13:41 Callibistrys a écrit :
Le compilateur ne peut pas savoir ce que contiennent tes tableaux à l'éxécution. Là il te prévient parce qu'il y a très visiblement un problème entre char* et float*, mais si V avait été un tableau de chaines de caractère ne contenant pas de succession de '%' en nombre impair, le code aurait continué et aurait fait de la b​ouse sans rien te dire.

Prends par exemple le code


int[1] = {0x61636163};
printf("%s\n", (char*)t);

et dis moi ce que ça t'affiche :hap:
Ca c'est pour les données.

"caca" :hap:

Callibistrys
2021-01-01 15:18:54

Le 01 janvier 2021 à 15:18:10 VegaVII a écrit :

Le 01 janvier 2021 à 15:13:41 Callibistrys a écrit :
Le compilateur ne peut pas savoir ce que contiennent tes tableaux à l'éxécution. Là il te prévient parce qu'il y a très visiblement un problème entre char* et float*, mais si V avait été un tableau de chaines de caractère ne contenant pas de succession de '%' en nombre impair, le code aurait continué et aurait fait de la b​ouse sans rien te dire.

Prends par exemple le code


int[1] = {0x61636163};
printf("%s\n", (char*)t);

et dis moi ce que ça t'affiche :hap:
Ca c'est pour les données.

"caca" :hap:

Et oui :hap:

VegaVII
2021-01-01 15:21:30

Le 01 janvier 2021 à 15:18:54 Callibistrys a écrit :

Le 01 janvier 2021 à 15:18:10 VegaVII a écrit :

Le 01 janvier 2021 à 15:13:41 Callibistrys a écrit :
Le compilateur ne peut pas savoir ce que contiennent tes tableaux à l'éxécution. Là il te prévient parce qu'il y a très visiblement un problème entre char* et float*, mais si V avait été un tableau de chaines de caractère ne contenant pas de succession de '%' en nombre impair, le code aurait continué et aurait fait de la b​ouse sans rien te dire.

Prends par exemple le code


int[1] = {0x61636163};
printf("%s\n", (char*)t);

et dis moi ce que ça t'affiche :hap:
Ca c'est pour les données.

"caca" :hap:

Et oui :hap:

Donc en un tableau "d'un seul caractère" tu as réussi à en afficher 4 ?
Je suppose que même si tu as déclaré une taille de 1 c'est le contenu lors de la déclaration qui viendra "repousser" la limité :(

Callibistrys
2021-01-01 15:25:19

Le 01 janvier 2021 à 15:21:30 VegaVII a écrit :

Le 01 janvier 2021 à 15:18:54 Callibistrys a écrit :

Le 01 janvier 2021 à 15:18:10 VegaVII a écrit :

Le 01 janvier 2021 à 15:13:41 Callibistrys a écrit :
Le compilateur ne peut pas savoir ce que contiennent tes tableaux à l'éxécution. Là il te prévient parce qu'il y a très visiblement un problème entre char* et float*, mais si V avait été un tableau de chaines de caractère ne contenant pas de succession de '%' en nombre impair, le code aurait continué et aurait fait de la b​ouse sans rien te dire.

Prends par exemple le code


int[1] = {0x61636163};
printf("%s\n", (char*)t);

et dis moi ce que ça t'affiche :hap:
Ca c'est pour les données.

"caca" :hap:

Et oui :hap:

Donc en un tableau "d'un seul caractère" tu as réussi à en afficher 4 ?
Je suppose que même si tu as déclaré une taille de 1 c'est le contenu lors de la déclaration qui viendra "repousser" la limité :(

Non, c'est juste parce que sizeof(int) vaut 4 sur ta machine.
Dans ta mémoire, à la position 0 du tableau t il y a un int, qui se trouve être la concaténation (mathématique) de quatre char 0x61, 0x63, 0x61, et 0x63.
Quand le code qui appelle print convertit ton t (type int*) en char*, il prend les octets quatre par quatre et les lit octet par octet ensuite selon la convention little endian (en commençant par la fin : 0x63, puis 0x61, puis 0x63, puis 0x61).
Prends une table ascii et regarde ce qui correspond à 0x63 et à 0x61 : 'c' et 'a' :ok:

VegaVII
2021-01-01 15:41:04

Le 01 janvier 2021 à 15:25:19 Callibistrys a écrit :

Le 01 janvier 2021 à 15:21:30 VegaVII a écrit :

Le 01 janvier 2021 à 15:18:54 Callibistrys a écrit :

Le 01 janvier 2021 à 15:18:10 VegaVII a écrit :

Le 01 janvier 2021 à 15:13:41 Callibistrys a écrit :
Le compilateur ne peut pas savoir ce que contiennent tes tableaux à l'éxécution. Là il te prévient parce qu'il y a très visiblement un problème entre char* et float*, mais si V avait été un tableau de chaines de caractère ne contenant pas de succession de '%' en nombre impair, le code aurait continué et aurait fait de la b​ouse sans rien te dire.

Prends par exemple le code


int[1] = {0x61636163};
printf("%s\n", (char*)t);

et dis moi ce que ça t'affiche :hap:
Ca c'est pour les données.

"caca" :hap:

Et oui :hap:

Donc en un tableau "d'un seul caractère" tu as réussi à en afficher 4 ?
Je suppose que même si tu as déclaré une taille de 1 c'est le contenu lors de la déclaration qui viendra "repousser" la limité :(

Non, c'est juste parce que sizeof(int) vaut 4 sur ta machine.
Dans ta mémoire, à la position 0 du tableau t il y a un int, qui se trouve être la concaténation (mathématique) de quatre char 0x61, 0x63, 0x61, et 0x63.
Quand le code qui appelle print convertit ton t (type int*) en char*, il prend les octets quatre par quatre et les lit octet par octet ensuite selon la convention little endian (en commençant par la fin : 0x63, puis 0x61, puis 0x63, puis 0x61).
Prends une table ascii et regarde ce qui correspond à 0x63 et à 0x61 : 'c' et 'a' :ok:

Ah oui mais c'est perché
en tout cas merci beaucoup pour ton aide :ange:

Callibistrys
2021-01-01 15:48:59

:ok:

Infos
Gestion du forum

contact@geevey.com

API disponible. Utilisez le paramètre "api" en GET, peu importe le contenu, sur une page du site.

Notes

    Partenaire: JVFlux
    Ce site n'est pas associé à Jeuxvideo.com ou Webedia. Nous utilisons seulement des archives publiques.
    Il est inutile de me spammer par e-mail pour supprimer un topic. Au contraire, en conséquence, je mettrais votre topic dans le bloc ci-dessous.
Non-assumage
    Personne n'a pas assumé de topic pour le moment.