OVH Cloud OVH Cloud

tableau double souffrance

12 réponses
Avatar
Jean Pierre Daviau
Bonjour aux médecins (je suis souffrant),


printf("\n*cinq: %s\n", *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 != '\n') {
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] = '\0';
if(strlen(*cinq[i*NCOLS + j]) >0)
strcpy(*cinq[i*NCOLS + j], s);
else
strcat(*cinq[i*NCOLS + j], s);
printf("\n*cinq: %s\n", *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.\n");
return EXIT_FAILURE;
} */

}
strcat(*cinq[i*NCOLS + j], ligne2);
printf("%s\n", *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

10 réponses

1 2
Avatar
Jean Pierre Daviau
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 <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 != '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;
}
Avatar
Eric Levenez
Le 4/12/06 20:40, dans <pQ_ch.68753$,
« Jean Pierre Daviau » a écrit :

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 -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Jean Pierre Daviau
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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

#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;
}

Avatar
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.




/* C:BorlandBCC55Binbcc32.exe -WCR tstdbleA.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

#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
Avatar
Gaël Tessier
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

Avatar
espie
In article <Wu3dh.68793$,
Jean Pierre Daviau wrote:
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.

Avatar
Blaise Potard

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.

Avatar
Jean Pierre Daviau
Ç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.

Avatar
Jean Pierre Daviau
À 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.


Avatar
Blaise Potard
À 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.


1 2