PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ und Pointer


neustadt
2010-11-05, 15:06:39
Hi,

irgendwie steh ich grad voll auf dem Schlauch. Wieso ist der folgende Code inkorrekt?


1: int intContrast;
2: int * ptrContrast;
3: ptrContrast = &intContrast;
4: *ptrContrast = 0;


Ich erstelle eine Integervariable.
Ich erstelle einen Zeiger der auf ein Integerwert verweist.
Der Zeiger bekommt die Adresse der Integervariable.
Über eine Dereferenzierung wird der Wert auf welchen die Adresse verweist verändert.
:confused:

Compiler meint: error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>f:\study\p\s5\2010.11.05\aufgabe4\aufgabe4\main.cpp(3) : error C2040: 'ptrContrast' : 'int' differs in levels of indirection from 'int *'
1>f:\study\p\s5\2010.11.05\aufgabe4\aufgabe4\main.cpp(3) : error C2440: 'initializing' : cannot convert from 'int *' to 'int'
1> There is no context in which this conversion is possible
1>f:\study\p\s5\2010.11.05\aufgabe4\aufgabe4\main.cpp(4) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>f:\study\p\s5\2010.11.05\aufgabe4\aufgabe4\main.cpp(4) : error C2086: 'int *ptrContrast' : redefinition
1> f:\study\p\s5\2010.11.05\aufgabe4\aufgabe4\main.cpp(2) : see declaration of 'ptrContrast'
1>Build log was saved at "file://f:\study\p\s5\2010.11.05\aufgabe4\aufgabe4\Debug\BuildLog.htm"
1>Aufgabe4 - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Sorry falls Banalität...

TheGamer
2010-11-05, 15:25:33
Der Code ist korrekt der rennt auch mit VS2008 korrekt.

Hast du uns evt nicht alles gezeigt

Senior Sanchez
2010-11-05, 15:29:47
Also gcc meldet auch keine Probleme.

Exxtreme
2010-11-05, 15:43:57
Der Code sollte in der Tat korrekt sein.

Btw. kopiere mal den gesamten Sourcecode.

Gast
2010-11-05, 15:44:45
Ja du musst den Code schon in eine Methode packen... so fuer sich allein wird das schwer gehn.

neustadt
2010-11-05, 16:04:09
da ist nix mehr. dann scheint es wohl ein ganz anderes problem zu sein...visualstudio?

Baalzamon
2010-11-05, 16:06:05
da ist nix mehr. dann scheint es wohl ein ganz anderes problem zu sein...visualstudio?
Ja du musst den Code schon in eine Methode packen... so fuer sich allein wird das schwer gehn.
Schreib die 4 Zeilen einfach mal in die main Methode. ;)

neustadt
2010-11-05, 16:11:53
Soso, aber wieso muss das denn in die main bzw. was genau? (werd gleich mal rumspielen)
Variablendeklarationen können doch auch außerhalb der main definiert werden.
Mir gehts jetzt nicht um Schönheit von Globalen vs Instanzvariablen.

neustadt
2010-11-05, 16:13:27
achso die zuweisungen müssen natürlich in eine methode...

sorry :redface:

EDIT: wobei man einem integerwert eine zahl auch außerhalb einer methode zuweisen kann. kann da jemand drauf eingehen, warum das mit ptrn nicht möglich ist?

Baalzamon
2010-11-05, 16:15:13
achso die zuweisungen müssen natürlich in eine methode...

sorry :redface:
;) Wollt es gerade noch schreiben. Wenn man das macht geht auch alles problemlos.

TheGamer
2010-11-05, 16:25:16
Ja klar die Fehler kommen wenn der einzige Inhalt von main.cpp das ist was er uns geschrieben hat.

Das hier geht

int main(int argc, char* argv)
{
int intContrast;
int * ptrContrast;
ptrContrast = &intContrast;
*ptrContrast = 0;

return 0;
}

TheGamer
2010-11-05, 16:29:42
EDIT: wobei man einem integerwert eine zahl auch außerhalb einer methode zuweisen kann. kann da jemand drauf eingehen, warum das mit ptrn nicht möglich ist?

int intContrast = 0;

int main(int argc, char* argv)
{
return 0;
}

Entspricht nicht

int intContrast;
intContrast = 0;

int main(int argc, char* argv)
{
return 0;
}

Und nicht erlaubt.

Das hier wuerde gehen

int intContrast;
int* ptrContrast = &intContrast;

int main(int argc, char* argv)
{
*ptrContrast = 0;

return 0;
}



Eben wenn die Referenz direkt in der gleichen Zeile steht

intContrast = 0;

Alleine stehend ausserhalb einer Funktion ist keine Deklaration mehr

Baalzamon
2010-11-05, 16:32:07
EDIT: wobei man einem integerwert eine zahl auch außerhalb einer methode zuweisen kann. kann da jemand drauf eingehen, warum das mit ptrn nicht möglich ist?
Hmmm. was meinst du denn genau?

include <iostream>
using namespace std;

int i = 5;
int* j = &i;

int main() {
cout << i << endl;
cout << j << endl;
cout << *j << endl;
return 0;
}
Gibt mir wie erwartet diese Ausgabe:

5
0x45e000
5
Oder meinst du was anderes?

TheGamer
2010-11-05, 16:44:25
Oder meinst du was anderes?

Ja er meint das was ich geschrieben habe

Er will

int intContrast;
int* ptrContrast;
ptrContrast = &intContrast;

int main(int argc, char* argv)
{
*ptrContrast = 0;
return 0;
}

neustadt
2010-11-05, 16:48:10
int intContrast = 0;

int main(int argc, char* argv)
{
return 0;
}

Entspricht nicht

int intContrast;
intContrast = 0;

int main(int argc, char* argv)
{
return 0;
}

Und nicht erlaubt.


Achso, davon bin ich eigenlich ausgegangen das es das selbe ist und damit auch erlaubt. Es entspricht aber immernoch der selben Art von Zuweisung und entspricht nur nicht der Definition von C++, oder?

TheGamer
2010-11-05, 17:59:49
Achso, davon bin ich eigenlich ausgegangen das es das selbe ist und damit auch erlaubt. Es entspricht aber immernoch der selben Art von Zuweisung und entspricht nur nicht der Definition von C++, oder?


Ja wenns erlaubt waere, waere es das gleiche.

del_4901
2010-11-05, 20:10:13
Fuer die Zukunft kannst du auch die Fehlermeldung anklicken und F1 druecken. Wenn du keine MSDN installiert haben solltest, kannst du auch alternativ nach dem Fehlercode im web suchen.

neustadt
2010-11-06, 18:55:05
wollte im nachhinein noch ein thx loswerden.

Fuer die Zukunft kannst du auch die Fehlermeldung anklicken und F1 druecken. Wenn du keine MSDN installiert haben solltest, kannst du auch alternativ nach dem Fehlercode im web suchen.

praktisch. dank auch für diesen tipp.