Avatar billede jackonlinux Nybegynder
25. september 2001 - 10:33 Der er 21 kommentarer

NULL pointer assignment..

Okay jeg sidder midt i et projekt og kan se dead-line
nærme sig.

Jeg har et 2 dimensionelt array i en struct, som skal indeholde 10.000 stregkoder.

struct DB {

char* kode_db[10000]; //Absolut MAX
}database;

Når jeg vil tilskrive en værdi til et array f.eks.
0 gør jeg det såldedes :

strcpy(kode_db[i],ny_streg_kode); //eks. vs. 1238965<-

Når jeg afslutter programmet kommer den med de velkendte 3 ord - NULL pointer assignment.

Er der nogen hér, som kan hjælpe mig hurrtigt ..
Gode point i sigte..
Nok ikke fordi det er så svært, men jeg sidder med håret i postkassen hvis jeg ikke får løst denne opgave inden til dead-line.



Avatar billede fri-hash Nybegynder
25. september 2001 - 10:40 #1
..med på en lytter
Avatar billede jpk Nybegynder
25. september 2001 - 11:28 #2
Har stregkoderne ikke en bestemt længde? I så fald hvad med at definere dit array som:
char kode_db[10000][20];
Avatar billede jpk Nybegynder
25. september 2001 - 11:31 #3
Du kopierer jo en streng til en pointer der ikke er initialiseret!!!
(du har kun et array af pointere, ikke noget memory...)
Avatar billede mickni33 Nybegynder
25. september 2001 - 11:32 #4
pointer array er altid meget komplex i disse string tider. Men kunne du ikke nøjes med et char [] istedet for så er der garenterede ikke noget problem

Men nu har du et pointer array så prøv et af de to metoder.

først & tegnet.

strcpy(kode_db[i],&ny_streg_kode);

eller

strcpy(*kode_db[i],&ny_streg_kode);

Avatar billede morten2 Nybegynder
25. september 2001 - 12:04 #5
Brug strdup istedet. Den allokere selv memmory for strengen.

kode_db[i] = strdup(ny_streg_kode);

Det som mickni33 gør er farligt. Hvis ny_streg_kode er temporer eller på anden måde bliver deallokeret senere bliver strengen i kode_db illegal.
Avatar billede morten2 Nybegynder
25. september 2001 - 12:05 #6
Husk at deallokere det memory strdup allokerede med free()
Avatar billede mickni33 Nybegynder
25. september 2001 - 12:09 #7
<<farligt>> lyder lidt voldsomt :) det er jo bare kode :)
Avatar billede jackonlinux Nybegynder
25. september 2001 - 12:13 #8
Jeg kigger lidt på dem og vender tilbage...
Avatar billede jpk Nybegynder
25. september 2001 - 12:37 #9
hvorfor bruger du ikke en dynamisk struktur som fx en vector?
Avatar billede mickni33 Nybegynder
25. september 2001 - 12:58 #10
tror ikke man kan bruge en vector fra STL da der arbejdes med c struct. Har selv haft problemer med at arbejde med structure når man blander med c++ kode.
Avatar billede jpk Nybegynder
25. september 2001 - 13:08 #11
=>morten2
Du skriver \"Hvis ny_streg_kode er temporer eller på anden måde bliver deallokeret senere bliver strengen i kode_db illegal\".
Jeg tror ikke mickni33\'s mening er (håber ikke) at kopiere ny_streg_kode\'s adresse ind i arrayet, men blot forestiller sig at ny_streg_kode er defineret som en char-array og ikke en pointer.
Måske mickni33 vil kommentere?
Avatar billede mickni33 Nybegynder
25. september 2001 - 13:13 #12
Kan ikke lide(eller ikk finde ud af det) at arbejde med char*[], kan man egentlig ikke lave

kode_db[i]=ny_streg_kode; 

istedet
Avatar billede jpk Nybegynder
25. september 2001 - 13:23 #13
Man kan godt, men det kræver jo netop, at ny_streg_kode ikke går ud af scope (fjernes fra stakken) og det er absolut ikke anbefalelsesværdigt!
Avatar billede jpk Nybegynder
25. september 2001 - 13:24 #14
Er det en C eller C++ compiler du har?
Avatar billede soepro Nybegynder
25. september 2001 - 14:44 #15
Null pointer assignment, får du fordi dit char* array ikke har fået tildelt nogen memory endnu. Hvis du ikke kan (eller vil !) tildele fast plads til de 10000 stregkoder fra starten af, skal du sørge for at alle pointere har værdien NULL til at begynde med, og så allokere hukommelse til dem efterhånden som du får brug for det:

#include <string.h>
const int TRUE  = 1;
const int FALSE = 0;
const int maxBarcodes = 10000;
int  nbrBarcodes;
char *barCodes[maxBarcodes];

for (nbrBarcodes 0; nbrBarcodes < maxBarCodes; idx++)
  barCodes[idx] = NULL;
nbrBarCodes = 0;
:
:
int storeBarCode(char *newBarCode)
{
  if (++nbrBarcodes > maxBarcodes)
  {
    // Skriv en fejl og hop ud.
    return FALSE;
  };
  barCodes[nbrBarcodes] = (char *)malloc(strlen(newBarCode)+1);
  strncpy(barCodes[nbrBarcodes], newBarcode, strlen(newBarcode)+1);
  return TRUE;
} //
:
:
// Når programmet er færdigt.
for (idx = nbrBarcodes - 1; idx >= 0; idx--)
  if (barCodes[idx] != NULL)
    free(barCodes[idx]);
:
Avatar billede jpk Nybegynder
25. september 2001 - 15:00 #16
Skift
for (nbrBarcodes 0; nbrBarcodes < maxBarCodes; idx++)
  barCodes[idx] = NULL;

ud med

ZeroMemory(barCodes, maxBarcodes*sizeof(char*));
Avatar billede soepro Nybegynder
25. september 2001 - 15:02 #17
eller

memset(barCodes, 0, sizeof(barCodes);

men for-løkken er nemmere at forstå.
Avatar billede morten2 Nybegynder
26. september 2001 - 01:37 #18
soepro:
Hvofor allokere mem i forvejen når man blot kan bruge strdup?
I gør det langt mere besværligt end nødvendigt.
strdup allokere memory samt kopiere strengen.
Mere skal der ikke til.
Avatar billede soepro Nybegynder
26. september 2001 - 08:48 #19
Morten2 >> Det er vist religion. malloc anvendes generelt, strdup \"duer\" kun med char-arrays.
Avatar billede morten2 Nybegynder
26. september 2001 - 10:21 #20
soepro: Ja strdup retunere en char* men det er jo netop hvad er streng er? Jeg forstår ikke hvad du mener?
Avatar billede reficul Nybegynder
05. januar 2002 - 20:24 #21
#define STREGKODE_LEN  20;

LPSTR lpszKode[10000];
LPSTR lpszBuffer;

//Allokér en stor mem chunck
lpszBuffer = (LPSTR)LocalAlloc(LPTR, 10000*STREGKODE_LEN);

//Fordel mem ud på de 10000 pointers
for (int x=0; x<10000; x++)
  lpszKode[x] = lpszBuffer + STREGKODE_LEN*x;

//Brug dem
lstrcpy(lpszKode[8], \"2378428\");
//osv.

//Frigør mem igen
LocalFree((HLOCAL)lpszBuffer);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester