Permalänk
Medlem

dubbel array i c++

vad ska returtypen för en dubbelarray vara
alltså:

RETURTYP Class::doMethod() { String tmp[1][1] = {{"a", "b"}, {"c", "d"}}; return tmp; }

Permalänk
Medlem

En array är väl more or less en pekare, så String* kanske?

edit: Var länge sedan jag kodade i C/C++ så mycket möjligt att jag skrivit fel syntax... men du fattar nog poängen.

Permalänk
Medlem

nä både enkel och dubbelpekare ger felmeddelande

Permalänk
Medlem

"printf("%s", tmp);" / "cout << tmp;"

Eller är det jag som suger på pekare eller vad det är?

Permalänk
Medlem

Det är en pekare du ska returnera String*, men du får inte skapa en array sådär o sen returnera.

Den funktion som tar emot pekaren kommer inte ha nåt minnesutrymme att peka mot.

Sen är arrayen du deklarerar av dimensionen 2*2, då du stoppar in 4 element i den. du deklarerar dem så att det bara ryms ett element, det orskakar nog ditt felmeddelande.

Du får först allokera utrymme med new, och sen komma ihåg att lämna tillbaks det med delete när du är klar.

Men nu har jag inte kodat c++ på över ett år, så jag kommer inte ihåg syntaxen riktigt, tror det är

String* tmp = new String[2][2];

o

delete [] tmp;

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Zic
Det är en pekare du ska returnera String*, men du får inte skapa en array sådär o sen returnera.

Den funktion som tar emot pekaren kommer inte ha nåt minnesutrymme att peka mot.

Sen är arrayen du deklarerar av dimensionen 2*2, då du stoppar in 4 element i den. du deklarerar dem så att det bara ryms ett element, det orskakar nog ditt felmeddelande.

Du får först allokera utrymme med new, och sen komma ihåg att lämna tillbaks det med delete när du är klar.

Men nu har jag inte kodat c++ på över ett år, så jag kommer inte ihåg syntaxen riktigt, tror det är

String* tmp = new String[2][2];

o

delete [] tmp;

Nu har jag som sagt inte rört c++ på väldigt länge heller, men "delete tmp" ska väl räcka?

Permalänk
Medlem

Jo, delete tmp bör väl räcka, tror jag.
Men jag har för mig att enligt standard ska man köra delete []

Permalänk
Medlem

Zic det där går inte, man får allokera i två steg.

int x = 100; string **tmp = new string[x]; for(int i = 0; i < x; i++) { tmp[i] = new string[200]; }

blir alltså tmp[100][200]

För övrigt går det helt enkelt inte att returnera arrays i C++ eftersom arrays bara är pekare, och du kan heller inte (om du vill sova gott om natten) returnera en pekare till en array du skapat i en funktion eftersom den skapas på stacken och försvinner när den går out of scope. Om du accessar arrayen direkt efter funktionen slutat finns iofs minnet kvar där i det flesta fall, men det är inte direkt säkert eller på något sätt rekommenderat någonsin. Utan du får göra det dynamiskt med new och kolla ihåg att deleta vad du skapat. Och jo, för arrays ska det vara delete [].

Men det enda smarta är egentligen att använda STL och std::vector... :
std::vector< std::vector<string> >

Visa signatur

hmm

Permalänk
Medlem
Permalänk

I vissa fall kan det vara fördelaktigt att skapa en struct och sedan lägga arrayen i den. Naturligtvis kan man lägga en massa annat i structen också. Detta förenklar en del särskilt om vectorn ska användas i många olika metoder. Det är ju mycket enklare att returnera en struct än alla de typer som du kan tänkas lägga in i structen och så slipper man lite osäkerhetsmoment med minneshanteringen (under förutsättning att structen är deklarerad mer globalt).

Visa signatur

The Programmer

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Erty
Zic det där går inte, man får allokera i två steg.

int x = 100; string **tmp = new string[x]; for(int i = 0; i < x; i++) { tmp[i] = new string[200]; }

blir alltså tmp[100][200]

För övrigt går det helt enkelt inte att returnera arrays i C++ eftersom arrays bara är pekare, och du kan heller inte (om du vill sova gott om natten) returnera en pekare till en array du skapat i en funktion eftersom den skapas på stacken och försvinner när den går out of scope. Om du accessar arrayen direkt efter funktionen slutat finns iofs minnet kvar där i det flesta fall, men det är inte direkt säkert eller på något sätt rekommenderat någonsin. Utan du får göra det dynamiskt med new och kolla ihåg att deleta vad du skapat. Och jo, för arrays ska det vara delete [].

Men det enda smarta är egentligen att använda STL och std::vector... :
std::vector< std::vector<string> >

Ja, så ska det vara. Som sagt, så var det länge sedan jag kodade c++

Permalänk
Medlem

alltså den verkar inte gilla en vector i en vector

vector<vector<String>> tmp;

ger

[C++ Warning] Notes.cpp(24): W8049 Use '> >' for nested templates instead of '>>'
[C++ Error] Notes.cpp(24): E2451 Undefined symbol 'tmp'
[C++ Error] Notes.cpp(24): E2299 Cannot generate template specialization from 'vector<_Tp,_Alloc>'
[C++ Error] Notes.cpp(28): E2299 Cannot generate template specialization from 'vector<_Tp,_Alloc>'
[C++ Warning] Notes.cpp(74): W8075 Suspicious pointer conversion

Permalänk
Citat:

Ursprungligen inskrivet av ninjja
alltså den verkar inte gilla en vector i en vector

vector<vector<String>> tmp;

ger

[C++ Warning] Notes.cpp(24): W8049 Use '> >' for nested templates instead of '>>'
[C++ Error] Notes.cpp(24): E2451 Undefined symbol 'tmp'
[C++ Error] Notes.cpp(24): E2299 Cannot generate template specialization from 'vector<_Tp,_Alloc>'
[C++ Error] Notes.cpp(28): E2299 Cannot generate template specialization from 'vector<_Tp,_Alloc>'
[C++ Warning] Notes.cpp(74): W8075 Suspicious pointer conversion

Ett mellanslag borde lösa det:
vector<vector<String> > tmp;

Visa signatur
Permalänk
Medlem

jupp

varför funkar inte detta?

fil.getline(buf, 256); if (buf == "[start]") { bla... }

Permalänk
Citat:

Ursprungligen inskrivet av ninjja
jupp

varför funkar inte detta?

fil.getline(buf, 256); if (buf == "[start]") { bla... }

Använd strcmp när du ska jämföra "strängar".

Visa signatur

The Programmer

Permalänk
Medlem

Otroligt! Vet inte hur många forum där det är någon som skriver en liknande fråga och som sedan får svar att använda std::vector eller nått annat. Ska han inte lära sig språket först???

Så här ska din metod se ut:

std::string** Class::doMethod() { std::string** str = new std::string*[2]; for( int i=0; i<2; i++) { str[i] = new std::string[2]; } str[0][0] = "Hej"; str[0][1] = "Svejs"; str[1][0] = "Uhm.."; str[1][1] = "Uhuuummm..."; return str; }

Och sedan för att frigöra allt minne så räcket inte en simpel delete [], utan så här måsta man göra:

void Class::free(std::string** strs) { for(int i=0; i<2; i++) { delete[] strs[i]; } delete[] strs; }

Sedan bör väll tillägas, att du bör kapsla in denna typen av arrayer i en struct eller class.

Permalänk
Medlem

Haha, lyssna på pago! Konstigt att första vettiga svaret ska komma så här sent på ett forum som heter "Sweclockers"...

Det var iaf kul att läsa igenom alla andras lite halvtaffliga försök

Permalänk
Medlem

Vad är det för fel på std::vector pago? Det är ju smidigare helt enkelt. I din funktion skulle man ju för övrigt behöva skicka med två intpekare/referenser som fylls med arrayernas dimension, annars lever man farligt.

Och ja min beskrivning var fel, visst ska det vara new string* med en fin liten stjärna, men det säger väl sig självt egentligen

Visa signatur

hmm

Permalänk
Medlem
Citat:

Vad är det för fel på std::vector pago? Det är ju smidigare helt enkelt. I din funktion skulle man ju för övrigt behöva skicka med två intpekare/referenser som fylls med arrayernas dimension, annars lever man farligt.

Citat:

Otroligt! Vet inte hur många forum där det är någon som skriver en liknande fråga och som sedan får svar att använda std::vector eller nått annat. Ska han inte lära sig språket först???

För övrigt är det absolut inget fel på std::vector.