tableau double souffrance

Le
Jean Pierre Daviau
Bonjour aux médecins (je suis souffrant),


printf("*cinq: %s", *cinq[i*NCOLS + j]); affiche *cinq: Il
Útait

ce qui est correct et puis crash.


/* tstdbleA.c */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

#define NRANGS 2
#define NCOLS 3

unsigned char *cinq[NRANGS][NCOLS];
int joinLines2array(unsigned char *ligne1, unsigned char *ligne2, unsigned
int lenin);



int joinLines2array(unsigned char *ligne1, unsigned char *ligne2, unsigned
int lenin) {
static int i;
int j, k=0;
unsigned char *s;


for (i = 0;i < NRANGS; i++) {
*cinq[i*NCOLS] = malloc(lenin);
while (*ligne1 != '') {
for (j = 0;j <NCOLS; j++) {
s = malloc(strlen(ligne1));
if(s){
while (*ligne1 != '^')
{
s[k] = *ligne1;
printf("%c ", s[k]);
ligne1++;
k++;
}
k++;
s[k] = '';
if(strlen(*cinq[i*NCOLS + j]) >0)
strcpy(*cinq[i*NCOLS + j], s);
else
strcat(*cinq[i*NCOLS + j], s);
printf("*cinq: %s", *cinq[i*NCOLS + j]);
}
}
s = s-k;
k = 0;
printf("1");
/* test négatif si s = null */
/* free(s);

if(s)
ligne1++;
else{
printf("s not freed.");
return EXIT_FAILURE;
} */

}
strcat(*cinq[i*NCOLS + j], ligne2);
printf("%s", *cinq[i*NCOLS + j]);
}
if(s)
free(s);

return 0;
}

int main(void){
unsigned char *une = "Il était^ une^ fois";
unsigned char *deux = "Il^ était deux^ fois.";

unsigned int len = strlen(une) + strlen(deux) + 1;
if(len)
joinLines2array(une, deux, len);

return 0;
}

Merci dans le sens je demande merci.

Jean Pierre Daviau
--
Easyphp1.8 with Apache1.3.24
Lcc, borland 5.5
windows Xp
asus p4 s533/333/133
Intel(R) Celeron (R) CPU 2.00 GHz
Processor Radeon7000 0x5159 agp
Vos réponses Page 1 / 2
Trier par : date / pertinence
Jean Pierre Daviau
Le #972515
Je m'améliore :-

printf("n*cinq: %sn", *cinq[i*NCOLS + j]); affiche *cinq: Il
Útait
printf("%c", s[k]); affiche u n e
ce qui est correct
et ... crash. ne printf pas
printf("n*cinq: %sn", *cinq[i*NCOLS + j]); affiche *cinq:
une



/* tstdbleA.c */
#include #include #include #include
#define NRANGS 2
#define NCOLS 3

unsigned char *cinq[NRANGS][NCOLS];
int joinLines2array(unsigned char *ligne1, unsigned char *ligne2, unsigned
int lenin);



int joinLines2array(unsigned char *ligne1, unsigned char *ligne2, unsigned
int lenin) {
static int i;
int j, k=0;
unsigned char *s;


for (i = 0;i < NRANGS; i++) {
*cinq[i*NCOLS] = malloc(lenin);
while (*ligne1 != 'n') {
for (j = 0;j <NCOLS; j++) {

s = malloc(strlen(ligne1));
if(s){
while (*ligne1 != '^')
{
s[k] = *ligne1;
printf("%c ", s[k]);
ligne1++;
k++;
}
}

s[k] = '';
if(strlen(*cinq[i*NCOLS + j])!= 0)
strcpy(*cinq[i*NCOLS + j], s);

printf("nc: -%c-n", s[k-1]);
printf("---: %p %pn", (void*)s, (void*)(s-k));
printf("*cinq: %sn", *cinq[i*NCOLS + j]);
ligne1++;
k = 0;
free(s);
}
free(s);
}
strcat(*cinq[i*NCOLS + j], ligne2);
printf("%sn", *cinq[i*NCOLS + j]);
}

return 0;
}

int main(void){
unsigned char *une = "Il était^ une^ fois";
unsigned char *deux = "Il^ était deux^ fois.";
unsigned int len = strlen(une) + strlen(deux) + 1;

printf("%snnn", une);


if(len)
joinLines2array(une, deux, len);

return 0;
}
Eric Levenez
Le #972514
Le 4/12/06 20:40, dans « Jean Pierre Daviau »
Je m'améliore :-


code.c: In function 'joinLines2array':
code.c:28: warning: pointer targets in passing argument 1 of 'strlen' differ
in signedness
code.c:40: warning: pointer targets in passing argument 1 of 'strlen' differ
in signedness
code.c:41: warning: pointer targets in passing argument 1 of 'strcpy' differ
in signedness
code.c:41: warning: pointer targets in passing argument 2 of 'strcpy' differ
in signedness
code.c:52: warning: pointer targets in passing argument 1 of 'strcat' differ
in signedness
code.c:52: warning: pointer targets in passing argument 2 of 'strcat' differ
in signedness
code.c: In function 'main':
code.c:60: warning: pointer targets in initialization differ in signedness
code.c:61: warning: pointer targets in initialization differ in signedness
code.c:62: warning: pointer targets in passing argument 1 of 'strlen' differ
in signedness
code.c:62: warning: pointer targets in passing argument 1 of 'strlen' differ
in signedness
code.c: In function 'joinLines2array':
code.c:19: warning: 'j' may be used uninitialized in this function


--
Éric Lévénez -- Unix is not only an OS, it's a way of life.

Jean Pierre Daviau
Le #972512
Je m'améliore :-|


unsigned char *une = "C'était^ une^ paisible^ révolution.n";
unsigned char *deux = "Tu^ étais deux^ bonnes^ répétitions.n";

while (*ligne1 != 'n') {
Semble inefficace, puisqu'il place le Tu de la deuxième ligne après le mot
révolution de la première ligne. Donc il
repart avec ligne2 ... Pourquoi?

Ça donne:

printf("%c ", s[k]); printf("tt%sn",
*cinq[i*NCOLS + j]);

C ' Ú t a i t ----------------------------C'Útait
u n e --------------------------------- une
p a i s i b l e ----------------------------paisible
r Ú v o l u t i o n .-----------------------------------------------> n ?
T u --------------------------------- rÚvolution.

Ú t a i s d e u x ------------------------Útais deux
b o n n e s ------------------------------bonnes
r Ú p Ú t i t i o n s .-----------------------------------------------> n ?
% s



...crash

-------------------------------------
/* tstdbleA.c */


#include #include #include #include
#define NRANGS 2
#define NCOLS 5

unsigned char *cinq[NRANGS][NCOLS];
int joinLines2array(unsigned char *ligne1, unsigned char *ligne2);



int joinLines2array(unsigned char *ligne1, unsigned char *ligne2) {
static int i=-1;
int j=0, k;
unsigned char *s;

i++;

while (*ligne1 != 'n') {
k = 0;

s = malloc(strlen(ligne1));
if(s){
while (*ligne1 != '^')
{
s[k] = *ligne1;
/* printf("-%c- ", s[k]); */
ligne1++;
k++;
}
}else
return EXIT_FAILURE;
s[k] = '';
printf("%st", s);
*cinq[i*NCOLS + j] = malloc(strlen(s));
if(strlen(*cinq[i*NCOLS + j]))
strcpy(*cinq[i*NCOLS + j], s);
if(*ligne1 !='n'){
ligne1++;
j++;
}
free(s);
}

/*
printf("------------n");
j++;
*cinq[i*NCOLS + j] = malloc(strlen(ligne2)+1);
strcat(*cinq[i*NCOLS + j], ligne2);
printf("%s %s %s %s %sn", *cinq[i*NCOLS + 0], *cinq[i*NCOLS + 1],
*cinq[i*NCOLS + 2],
*cinq[i*NCOLS + 3], *cinq[i*NCOLS + 4]);
*/
return 0;
}

int main(void){
unsigned char *une = "C'était^ une^ paisible^ révolution.n";
unsigned char *deux = "Tu^ étais deux^ bonnes^ répétitions.n";


printf("%snnn", une);

joinLines2array(une, deux);

return 0;
}

Jean Pierre Daviau
Le #972511
Je l'ai!
Mes salutations.

C'Útait une paisible rÚvolution. Tu Útais deux bonnes rÚpÚtitions.^

Alors, vous pouvez y aller... de vos critiques.




/* C:BorlandBCC55Binbcc32.exe -WCR tstdbleA.c */
#include #include #include #include
#define NRANGS 2
#define NCOLS 5

unsigned char *cinq[NRANGS][NCOLS];
int joinLines2array(unsigned char *ligne1, unsigned char *ligne2);



int joinLines2array(unsigned char *ligne1, unsigned char *ligne2) {
static int i = -1;
int j = 0, k;
unsigned char *s;

i++;

while (*ligne1 != 'n') {
k = 0;
s = malloc(strchr(ligne1, '^') - ligne1);
if (s) {
while (*ligne1 != '^') {
s[k] = *ligne1;
ligne1++;
k++;
}
} else
return EXIT_FAILURE;
s[k] = '';

/* printf("%st", s); */
*cinq[i*NCOLS + j] = malloc(strlen(s)+1);
if (strlen(*cinq[i*NCOLS + j]))
strcpy(*cinq[i*NCOLS + j], s);

if(j < (NCOLS-1))j++; else {free(s); break; }
ligne1++;
free(s);
}

*cinq[i*NCOLS + j] = malloc(strlen(ligne2)+1);
strcpy(*cinq[i*NCOLS + j], ligne2);

printf("%s %s %s %s %sn", *cinq[i*NCOLS + 0], *cinq[i*NCOLS + 1],
*cinq[i*NCOLS + 2],
*cinq[i*NCOLS + 3], *cinq[i*NCOLS + 4]);

return 0;
}

int main(void) {
unsigned char *une = "C'était^ une^ paisible^ révolution.^n";
unsigned char *deux = "Tu étais deux bonnes répétitions.^n";


printf("%snnn", une);

joinLines2array(une, deux);

return 0;
}

JPD
Gaël Tessier
Le #972510
Jean Pierre Daviau wrote:
Je l'ai!
Mes salutations.


Ça marche peut-être, mais à voir ta façon d'utiliser les tableaux à
deux dimensions, c'est un peu un coup de chance et on peut en déduire
que tu n'as pas compris comment les utiliser.


unsigned char *cinq[NRANGS][NCOLS];

*cinq[i*NCOLS + j] = malloc(strlen(s)+1);


Pourquoi écrire "*cinq[i*NCOLS + j] = ..." alors que cinq est un
tableau à deux dimensions. La bonne façon d'écrire serait :
"cinq[i][j] = ...".

Les pointeurs (chaînes de caractères ici) et les tableaux ayant
beaucoup d'analogies, tu fais des confusions. Avant de chercher à
faire des programmes "compliqués", utilise un tableau d'entiers où tu
n'auras pas besoin de malloc, remplis-le puis teste des parcours et
des affichages de ce tableau.

--
Gaël Tessier
http://www.tessier-net.org

espie
Le #972508
In article Jean Pierre Daviau
Je l'ai!
Mes salutations.

C'Útait une paisible rÚvolution. Tu Útais deux bonnes rÚpÚtitions.^

Alors, vous pouvez y aller... de vos critiques.


Bon, on va commencer par une simple. Qu'est-ce que tu fous avec
des 'unsigned char', alors que tu es visiblement en train de manipuler
des chaines de caracteres ? Ca s'appelle des 'char', chez moi.

Blaise Potard
Le #977697

while (*ligne1 != 'n') {
k = 0;
s = malloc(strchr(ligne1, '^') - ligne1);
if (s) {


Que se passe-t-il si la chaine ligne1 ne contient pas le caractère '^' ?
Es-tu certain que ça ne puisse jamais arriver ?

À ta place, je ferais plutôt:

size_t s_len;
char * trouve = strchr(ligne1, '^');
if (trouve == NULL) {...}
else {
s_len = trouve - ligne1;
s = malloc (s_len + 1);
...

(oui, ta chaîne s était trop courte d'un caractère).

while (*ligne1 != '^') {
s[k] = *ligne1;
ligne1++;
k++;
}


Pourquoi ne pas plutôt faire un strncpy(s, ligne1, s_len) ?

} else
return EXIT_FAILURE;
s[k] = '';


s[s_len] = '';


/* printf("%st", s); */
*cinq[i*NCOLS + j] = malloc(strlen(s)+1);


Argh !
cinq[i][j] = malloc(s_len+1);

if (strlen(*cinq[i*NCOLS + j]))


??????
Je ne vois pas du tout ce que tu cherches à faire, mais à mon avis c'est
une mauvaise idée. Peut-être veux-tu vérifier que ton pointeur a bien
été alloué ? Dans ce cas, c'est

if (cinq[i][j] != NULL)

strcpy(*cinq[i*NCOLS + j], s);


Ah, c'est ça que tu voulais faire ? Tu pouvais te passer complètement de
la chaine s en faisant directement un :

strncpy(cinq[i][j], ligne1, s_len);
cinq[i][j][s_len] = '';


if(j < (NCOLS-1))j++; else {free(s); break; }
ligne1++;


Avec mes modifs, cette ligne devient ligne1 += s_len + 1;

free(s);
}


Je te laisse corriger le reste du code en conséquence.

Jean Pierre Daviau
Le #976178
Ça marche peut-être, mais à voir ta façon d'utiliser les tableaux à
deux dimensions, c'est un peu un coup de chance et on peut en déduire
que tu n'as pas compris comment les utiliser.
c'est très probable



Les pointeurs (chaînes de caractères ici) et les tableaux ayant
beaucoup d'analogies, tu fais des confusions. Avant de chercher à
faire des programmes "compliqués",


Celui- là me servira à quelque chose... sur mon ordi.
Et puis, il n'est pas si compliqué.
Et puis, si on recule à la moindre difficulté.
Et puis peut-être as-tu raison...

Merci de ton attention.

Jean Pierre Daviau
Le #976176
À propos des unsigned:
C:Documents and SettingsJean PierreBureau>test ±@£¢¤¬¦²³¼½¾
?@úóñ¼ª???¢¥
J'ai trouvé comment enregistrer en western european 0850 avec EditPlus 2 et
enlevé les unsigneds.

À ta place, je ferais plutôt:
size_t s_len;
char * trouve = strchr(ligne1, '^');
if (trouve == NULL) {...}
else {
s_len = trouve - ligne1;
s = malloc (s_len + 1);
oui


(oui, ta chaîne s était trop courte d'un caractère).
Non, je remplaçais le ^ (s'il y en avait :-) par un


Pourquoi ne pas plutôt faire un strncpy(s, ligne1, s_len) ?
s[s_len] = '';
J'avais la tête prise par les caractères.


strcpy(*cinq[i*NCOLS + j], s);
cinq[i][j][s_len] = '';



C'est quoi ça [s_len] en troisième position.

Merci.


Blaise Potard
Le #975905
À propos des unsigned:
C:Documents and SettingsJean PierreBureau>test ±@£¢¤¬¦²³¼½¾
?@úóñ¼ª???¢¥
J'ai trouvé comment enregistrer en western european 0850 avec EditPlus 2 et
enlevé les unsigneds.


Je comprend pas, mais je pense que ce n'est pas grave.

(oui, ta chaîne s était trop courte d'un caractère).


Non, je remplaçais le ^ (s'il y en avait :-) par un


Si si, je t'assure :-)

Ton strchr(ligne1, '^') te donnant la position du premier caractère '^',
le s_len est donc *exactement* égal à la longueur du mot précédant le
'^'. Il faut donc rajouter 1 pour avoir de la place pour le ''. Tu
peux essayer sur un example, pour voir.

cinq[i][j][s_len] = '';



C'est quoi ça [s_len] en troisième position.


cinq[i][j] est un char *, cinq[i][j][s_len] est le caractère d'indice
s_len de cette chaîne. Il serait peut-être un peu plus propre d'écrire
*(char[i][j] + s_len) mais je trouve que c'est moins clair,
personnellement.


Publicité
Poster une réponse
Anonyme