Accueil > Forum > > > > Problème avec memcpy et int
Problème avec memcpy et int
lundi 30 janvier 2012 à 09:59:39 |
Problème avec memcpy et int

mickmick57
|
Bonjour,
Je m'adresse à vous, car j'ai un problème avec la fonction memcpy et les entiers sur unix. On retrouve un bon nombre de foi le détail de la fonction memcpy sur le net mais très peut de sujet abordant les problème dût à l'architecture.
Voila mon cas,
j'ai une fonction qui permet d'éxecuter des requetes dans une base Sybase et qui utilise la client library.
Cet fonction fonctionne très bien sur une machine 32 bit , par contre sur une 64 bit, il n'y a aucun problème avec les char, par contre mes int sont carrement faux.
Je me tourne vers vous car je ne voit pas la source du problème,
merci d'avance pour votre aide
Voici le code : (je pense que le problème vient de l'endroit ou l'on fait les memcpy/memmove)
Code C/C++ :
int CmdSQL::Execute()
{ // Lancer la commande SQL contenue dans cmd
// et creer des objets ResultSet
CS_RETCODE results_ret,ret;
CS_INT result_type,count;
CS_DATAFMT *dtfmt = NULL;
CS_INT *datalength;
CS_SMALLINT *indicator;
void **tab = NULL;
int i;
bool termine;
ResultSet *res = NULL;
char msg[50+1];
int resultat = 0;
int resultat2 = 0;
char * memTemp;
Show("CmdSQL::Execute()");
Show(txt);
connect->Debug(txt);
int tries = 0;
do
{
if(ct_send(cmd) != CS_SUCCEED)
{
//Error("ct_send() failed");
connect->Debug("ct_send() failed");
return -1;
}
while((results_ret = ct_results(cmd,&result_type)) == CS_SUCCEED)
{ switch(result_type)
{ case CS_ROW_RESULT:
res = new ResultSet;
res->connect = connect;
i = 1;
termine = false;
res->nbCols = 0;
// Get number of columns
if(ct_res_info(cmd,CS_NUMDATA,&res->nbCols,CS_UNUSED,NULL) != CS_SUCCEED)
{ //Error("ct_res_info() failed");
connect->Debug("ct_res_info() failed");
return -1;
}
// Get columns descriptions
res->datafmt = (CS_DATAFMT**)malloc(res->nbCols * sizeof(CS_DATAFMT*));
for(int j=1;j<=(res->nbCols);j++)
{
dtfmt = (CS_DATAFMT*)malloc(sizeof(CS_DATAFMT));
if(ct_describe(cmd,j,dtfmt) != CS_SUCCEED)
{ //Error("ct_describe() failed");
connect->Debug("ct_describe() failed");
return -1;
}
res->datafmt[j-1] = dtfmt;
}
datalength = (CS_INT*)malloc(res->nbCols*sizeof(CS_INT));
indicator = (CS_SMALLINT*)malloc(res->nbCols*sizeof(CS_SMALLINT));
tab = (void**)calloc(res->nbCols,sizeof(void*));
for(int j=0;j<res->nbCols;j++)
{
//ConvertType(res->datafmt[j]);
tab[j] = (void*)calloc(1,res->datafmt[j]->maxlength);
ret = ct_bind(cmd,j+1,res->datafmt[j],tab[j],datalength+j,indicator+j);
memTemp = (char*)malloc(res->datafmt[j]->maxlength);
memTemp = (char*)tab[j];
connect->Debug(String()<<"This data : "<<(char*)memTemp);
if(ret != CS_SUCCEED)
{ //Error("ct_bind() failed");
connect->Debug("ct_bind() failed");
return -1;
}
}
res->res = NULL;
res->nbLines = 0;
while(((ret = ct_fetch(cmd,CS_UNUSED,CS_UNUSED,CS_UNUSED,&count)) == CS_SUCCEED) || (ret == CS_ROW_FAIL))
{ if(ret == CS_ROW_FAIL)
{ //Error("ct_fetch() failed");
connect->Debug("ct_fetch() failed");
return -1;
}
res->nbLines++;
res->res = (void***)realloc(res->res,res->nbLines*sizeof(void**));
res->res[res->nbLines-1] = (void**)calloc(res->nbCols,sizeof(void*));
for(int j=0;j<res->nbCols;j++)
{
if((res->datafmt[j]->datatype == CS_CHAR_TYPE) /*|| (res->datafmt[j]->datatype == CS_UNICHAR_TYPE)*/)
{
connect->Debug(String()<<"CHAR type from data ");
res->res[res->nbLines-1][j] = (void*)malloc(datalength[j]+1);
memcpy(res->res[res->nbLines-1][j],tab[j],datalength[j]+1);
((char*)(res->res[res->nbLines-1][j]))[(int)datalength[j]] = '\0';
}
else if(res->datafmt[j]->datatype == CS_UNICHAR_TYPE)
{
connect->Debug(String()<<"UNICHAR type from data ");
res->res[res->nbLines-1][j] = (void*)malloc(datalength[j]+sizeof(CS_UNICHAR));
memcpy(res->res[res->nbLines-1][j],tab[j],datalength[j]);
((CS_UNICHAR*)(res->res[res->nbLines-1][j]))[(int)datalength[j]/sizeof(CS_UNICHAR)] = 0;
}
else if(res->datafmt[j]->datatype == CS_INT_TYPE) //pour les entiers
{
connect->Debug(String()<<"INT type ");
res->res[res->nbLines-1][j] = calloc(1,sizeof(CS_CHAR));
memcpy(res->res[res->nbLines-1][j],tab[j],sizeof(CS_INT));
((CS_INT*)(res->res[res->nbLines-1][j]))[(int)datalength[j]/sizeof(CS_INT)] = 0;
}
else if(res->datafmt[j]->datatype == CS_SMALLINT_TYPE) //pour les smallint
{
connect->Debug(String()<<"SMALLINT type ");
res->res[res->nbLines-1][j] = calloc(1,sizeof(CS_CHAR));
memcpy(res->res[res->nbLines-1][j],tab[j],sizeof(CS_SMALLINT));
((CS_SMALLINT*)(res->res[res->nbLines-1][j]))[(int)datalength[j]/sizeof(CS_SMALLINT)] = 0;
}
// else
// {
// connect->Debug(String()<<"AUTRE type from data ");
// res->res[res->nbLines-1][j] = (void*)calloc(1,datalength[j]);
// memcpy(res->res[res->nbLines-1][j],tab[j],datalength[j]);
// }
}
}
for(int j=0;j<res->nbCols;j++)
{ free(tab[j]);
}
free(tab);
free(datalength);
free(indicator);
if(ret == CS_END_DATA)
{ nbResultSet++;
rs = (ResultSet**)realloc(rs,nbResultSet*sizeof(ResultSet*));
rs[nbResultSet-1] = res;
}
else
{ //Error("ct_fetch() failed (2)");
connect->Debug("ct_fetch() failed (2)");
return -1;
}
break;
case CS_CMD_SUCCEED:
//DEBUGFNC("No lines returned");
break;
case CS_CMD_FAIL:
// Error printed by the callback
resultat = -1;
break;
case CS_CMD_DONE:
break;
case CS_STATUS_RESULT:
dtfmt = new CS_DATAFMT;
dtfmt->datatype = CS_INT_TYPE;
dtfmt->format = CS_FMT_UNUSED;
dtfmt->count = 1;
dtfmt->locale = NULL;
if(ct_bind(cmd,1,dtfmt,&resultat2,NULL,NULL) != CS_SUCCEED)
//Error("ct_bind() failed (2)");
connect->Debug("ct_bind() failed (2)");
if(ct_fetch(cmd,CS_UNUSED,CS_UNUSED,CS_UNUSED,NULL) != CS_SUCCEED)
//Error("ct_fetch() failed (3)");
connect->Debug("ct_fetch() failed (3)");
//res->result = resultat;
ct_fetch(cmd,CS_UNUSED,CS_UNUSED,CS_UNUSED,NULL);
delete dtfmt;
if(resultat != -1) // on donne priorite au resultat de CS_CMD_FAIL
resultat = resultat2;
break;
default:
//Error("Unwaited result from ct_results()");
connect->Debug("Unwaited result from ct_results()");
break;
}
}
}while(connect->GetDeadLockState() && (tries < TRY_ATTEMPT));
switch(results_ret)
{ case CS_END_RESULTS:
break;
case CS_FAIL:
//Error("ct_results() failed");
connect->Debug("ct_results() failed");
resultat = -1;
break;
default:
//Error("Unwaited result from ct_results() (2)");
connect->Debug("Unwaited result from ct_results() (2)");
resultat = -1;
break;
}
connect->Debug(String("Command returned ")<<resultat);
connect->Debug(String()<<nbResultSet<<" result sets returned");
for(int r=0;r<nbResultSet;r++)
{ connect->Debug(String()<<rs[r]->NbLines()<<" lines in result set "<<r);
if(connect->LogData())
rs[r]->Debug(connect);
}
//connect->Debug("--------------------------------------------");
result = resultat;
return resultat;
}
note: les CS_INT,CS_CHAR ... ne sont rien d'autre que des int, char ...
|
|
lundi 30 janvier 2012 à 10:29:01 |
Re : Problème avec memcpy et int

Renfield
|
J'ai juste survollé. Le sujet ne semble pas maitrisé... Le soucis est que tu alloue de la mémoire,n opération loin d'être nodine pour la bonne marche de ton process...
Code C/C++ : // Get columns descriptions
res->datafmt = (CS_DATAFMT**)malloc(res->nbCols * sizeof(CS_DATAFMT*));
for(int j=1;j<=(res->nbCols);j++) {
dtfmt = (CS_DATAFMT*)malloc(sizeof(CS_DATAFMT));
if(ct_describe(cmd,j,dtfmt) != CS_SUCCEED) {
//Error("ct_describe() failed");
connect->Debug("ct_describe() failed");
return -1;
}
res->datafmt[j-1] = dtfmt;
}
pourquoi faire un malloc de dtfmt a chaque tour de boucle ?
ne peux tu réutiliser le même pour chaque colonne ?
Pourquoi ne fais tu pas de free de ton dtfmt ?
Vive les fuites mémoire...
Code C/C++ : memTemp = (char*)malloc(res->datafmt[j]->maxlength);
memTemp = (char*)tab[j];
a Quoi joues tu ?
Ton erreur semble là :
res->res[res->nbLines-1][j] = calloc(1,sizeof(CS_CHAR));
memcpy(res->res[res->nbLines-1][j],tab[j],sizeof(CS_INT));
pourquoi allouer un sizeof(CS_CHAR) ?
n'est-ce pas un peu petit pour stocker ton INT ?
Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
|
|
lundi 30 janvier 2012 à 10:45:45 |
Re : Problème avec memcpy et int

mickmick57
|
Bonjour Renfield,
Tout d'abord je te remercie d'avoir répondu à mon post,
en faite, je vient de reprendre le programme suite à cet erreur, du coup je ne le connais pas encore vraiment,
j'ai vu que dans le programme que des free ont été fait.
je ne peut pas réutiliser le même dtfmt à chaque boucle car il stocke la taille le type de la colonne, la taille ... pour chaque colonne, je m'en ensuite un peut plus loin dans la fonction pour connaitre le type (CS_CHAR, CS_UNICHAR ...)
Désolé pour le "memTemp" je l'avait mis en place pour un petit test car je pensait que c'était un problème du à un pointeur.
Je vais aller voir le bout de code d'on tu m'a parlé et je reviendrais pour dire ce qu'il en et.
Peut il y avoir une raison pour que cela fonctionne en 32 bit et pas en 64 bit?
merci
|
|
lundi 30 janvier 2012 à 11:08:27 |
Re : Problème avec memcpy et int

mickmick57
|
Re,
La fonction me retourne ce résultat :
1|1644972474368|38852274159616|TST2353516|4294967296|17179869184|43383464656896|115964116992|0103|REF 01003|21474836480|N|0|21474836480|0|0|0|1|
au lieu de ces valeurs
1|397|9046|TST2353516|1|4|10101|27|01003|REF 01003|5|O|0|1|0|1|NULL|1
Les types sont: int/int/int/char(10)/int/int/int/int/char(4)/char(10)/int/char(1)/int/int/int/int/int/char(1)
Le premier nombre est un entier et il fonctionne, tout le reste des entiers sont erroné, mais les char/string sont bon
|
|
lundi 30 janvier 2012 à 11:23:20 |
Re : Problème avec memcpy et int

Renfield
|
1644972474368
donne en hexa :
17F00000000
de la a se dire que ton memcpy est foireux, y'a pas de kilometres...
pas pigé l'interet de :
((CS_INT*)(res->res[res->nbLines-1][j]))[(int)datalength[j]/sizeof(CS_INT)] = 0;
on dirait un copier coller d'une mise a '\0' de la fin d'une chaine de caractères
Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
|
|
lundi 30 janvier 2012 à 11:28:28 |
Re : Problème avec memcpy et int

mickmick57
|
en faite, cet ligne met à 0 (ou à la valeur préciser à la fin), les lignes qui sont NULL dans la BDD.
En faite tab est un tableau de void* qui contient donc des adresses mémoire, du coup on a la première valeur et la longueur de la donné, c'est pour ça que je pense que cela vient de la différence entre la machine 32 et 64
|
|
lundi 30 janvier 2012 à 11:32:26 |
Re : Problème avec memcpy et int

Renfield
|
Réponse acceptée !
en faite, cet ligne met à 0 (ou à la valeur préciser à la fin), les lignes qui sont NULL dans la BDD.
C'est faux... mais bien essayé...
cette ligne est fausse, et dangereuse.
A supprimer.
OUI !
CLAIREMENT !
Cela semble lié au fait que tu joues avec du 32 et du 64 !
Le tout est de trouver où tu t'es planté...
Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
|
|
lundi 30 janvier 2012 à 11:56:05 |
Re : Problème avec memcpy et int

mickmick57
|
re, je suis aller modifier le memcpy
Code C/C++ : memcpy(res->res[res->nbLines-1][j],tab[j],datalength[j]);
en
Code C/C++ : memcpy(res->res[res->nbLines-1][j],tab[j],sizeof(int)/2);
il est normal que les valeurs ne sont pas encore les bonnes mais au moins y a du changement,
elles sont toutes a 0
|
|
lundi 30 janvier 2012 à 11:59:37 |
Re : Problème avec memcpy et int

Renfield
|
pourquoi ce /2 ?
sizeof(int) est il equivalent à sizeof(CS_INT) ?
as tu supprimé la ligne qui met le zero a la suite ?
Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
|
|
lundi 30 janvier 2012 à 17:29:32 |
Re : Problème avec memcpy et int

mickmick57
|
J'ai passer cette ligne en commentaire,
j'ai mis un /2 car ce programme fonctionnait correctement sur une machine 32 bit,
de ce fait, je pensait (en essayant) diviser la taille du int (étant donné que la taille d'un int dépend de l'architecture.
|
|
Cette discussion est classée dans : int, cs, debug, res, ct
Répondre à ce message
Sujets en rapport avec ce message
new - debug / release [ par magic_Nono ]
PB du new.... alors que ça passe avec des alloc classiquesOn me conceil d'utiliser des new plutot que des malloc en C++très bien maisvoici un petit mo
Format de données [ par leskritiques ]
Voici le programme que je veux modofier :#include "chaine.h"#include "entreeSortie.h"#include "chaine.cpp"#include "entreeSortie.cpp"int pgcd (const i
steganographie C [ par trypon ]
Bonjour je programme sous ggcc (LINUX) et j'ai un petit pb avec mon programme j'arrive a mettre un texte dans l'image mais pas à faire le contrairela
Probleme de passage d'argument [ par dr971 ]
Bonjour , j'ai un petit prob (plutot un gros)En fait j'ai une class A et une class BclassA{ public : void setResistance(int); //mutat
Probleme de preprocesseur [ par alphaone ]
Bonjour, j'ai un fichier d'en tête .h inclut partout ou il y as:#ifndef INCLUDE_ENV_H#define INCLUDE_ENV_H//debug level, 0: no debug, 10 critical and
Modification d'un crytage d'hostname sur unrealircd3.2.7 [ par Loveurs ]
Bonsoir,J'aimerai savoir si quelqu'un serrai comment modifier le crytage d'host de unreal de façon à faire crytage.wanadoo.fr pour les ip résolues, es
Erreur de définition de pointeurs [ par HellYodan ]
Bonjour,j'ai codé ce code mais à chaque fois que je compile il me met qu'il y a une erreur de définition de pointeurs. Mais je ne vois pas comment rég
debug,flag ou drapeau [ par badsha ]
bonjour a tous je voudrai savoir comment utiliser un debug par exemple int flag=0; if (flag==0) { int a[3]; int b[4]={1,2,3}; for(i=0;i<4;i++) a[i]
Erreurs algo [ par Coincoinisback ]
Bonjour, j'ai un petit problème avec un algorithme, je dois trouver les erreurs pour les corriger mais après plusieurs reprises mon algorithme ne marc
pbs avec une calculatrice [ par Nonobis ]
slt tous ! Le premier qui m'aidea sera le bienvenu ...(1er post ici ...)Voial, le prob est dans le code d'une calculatrice en c que je susi en train d
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|