webForumDet fria alternativet

Problem med att skicka pekare till funktion

C/C++

4 svar · 347 visningar · startad av mangan

Medlem sedan feb. 2003216 inlägg
Frågan#1

Hej!

Jag har ett problem som jag inte kan få rätsida på. Vill göra följande:

// innehåller ett meddelande på flera rader
std::string* msg = new std::string[256];

std::string* returnMsg = funktion(skicka pekaren till strukturen så jag kan löpa igenom den och ta hand om alla rader);

Har suttit och pillat ett bra tag nu och allt jag kan få ut är raderna med en massa skräp i mellan. Antar att jag lyckas få tag på första minnespositionen för min struktur, sen stegar jag bara igenom den tecken för tecken och inte rad för rad.

Snälla hjälp mig!

PS. En sak till: När man deklarerar en pekare till en array som jag har gjort ovan, hur får man fram hur många platser arrayen har? .DS.

Medlem sedan juni 20008 205 inlägg
#2

Re: Problem med att skicka pekare till funktion

mangan skrev:

Hej!

Jag har ett problem som jag inte kan få rätsida på. Vill göra följande:

// innehåller ett meddelande på flera rader
std::string* msg = new std::string[256];

std::string* returnMsg = funktion(skicka pekaren till strukturen så jag kan löpa igenom den och ta hand om alla rader);

Har suttit och pillat ett bra tag nu och allt jag kan få ut är raderna med en massa skräp i mellan. Antar att jag lyckas få tag på första minnespositionen för min struktur, sen stegar jag bara igenom den tecken för tecken och inte rad för rad.

Jag antar att du med "rad" menar ett element i stringarrayen. Kom ihåg att det finns en gigantisk skillnad mellan string och char*, den förra är en rätt komplicerad klass, medan den senare bara är en pekare till någonstans i minnet där det finns en massa char efter varann.

Du borde kunna göra så här:

std::string *dinfunktion(std::string *lines, int numElements){
	for (int i = 0; i < numElements; i++)
		cout << lines[i] << endl;
	std::string *reply = new std::string[256];
	// fyll strängarna i reply med innehåll...
	return reply;
}
...
std::string *msg = new std::string[256];
std::string* returnMsg = dinfunktion(msg, 256);

.. men då vet du inte hur många element som finns i den array som returneras, om du inte låter sista elementet vara NULL eller så.

mangan skrev:

PS. En sak till: När man deklarerar en pekare till en array som jag har gjort ovan, hur får man fram hur många platser arrayen har? .DS.

Det kan du inte få på dynamiskt allokerade arrayer, det måste du hålla koll på själv. Därför är det ofta trevligare att använda vector- eller listklasserna.

Medlem sedan feb. 2003216 inlägg
#3

Tack för svaret Spango!
Har nu bytt till att använda en vector istället. Märkte dock en lite konstig grej när man deklarerar en ny vector:

// detta funkar inte, kompileringsfel
vector(std::string> vec;

// detta funkar dock
using namespace std;
.
.
vector<string> vec;

Ska det verkligen vara så eller är det något konstigt med Dev-C++/Mingw?

Medlem sedan juni 20008 205 inlägg
#4

mangan skrev:

Tack för svaret Spango!
Har nu bytt till att använda en vector istället. Märkte dock en lite konstig grej när man deklarerar en ny vector:

// detta funkar inte, kompileringsfel
vector(std::string> vec;

Jag antar att du inte har med syntaxfelet? ;)
Problemet borde nog bero på att vector också ligger i std:

std::vector<std::string> vec;
Medlem sedan feb. 2003216 inlägg
#5

HAHAHAHA!!

Ibland blir man blind av sin egen kod. Tror också att problemet ligger där. Nu har jag iaf kört med namespace std så jag orkar inte ändra tillbaka. Det som förvillade mig var att kompilatorn klagade på att vector inte kunde initieras utan typ.

Tack igen då! :)

253 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)