Frage zum C-Tutorial Kapitel Zeiger und Attribute

Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
Antworten
Ramnad
Beiträge: 12
Registriert: Do Okt 29, 2015 3:10 pm

Frage zum C-Tutorial Kapitel Zeiger und Attribute

Beitrag von Ramnad » Do Okt 29, 2015 3:46 pm

Hallo zusammen,

ich bin dabei mich durch das C-Tutorial durchzuarbeiten, ürigens bis her muss ich sagen klasse tutorial, und hab da einpaar Verständnisfragen.
Zu den Zeigern:
Zeiger zeigen ja auf eine zuvor definierte arrays oder variablen, also so wie ich das verstanden habe, muss eine Identifikator auf den der Zeiger zeigt eine Adresse im Speicher haben muss
also in dem Fall

Code: Alles auswählen

//das geht
int a = 2;
int * p = &a;
//das geht nicht
int * p = &2;
warum ist dann

Code: Alles auswählen

char * text = "proggen.org";
//bzw.
char const * text = "proggen.org";
ein korrekter code. Liegt denn eine Zeichenkette irgendwo im Speicher?

Zu den Attributen:
Ich habe das programm zum festellen der zeichenlänge und zum ersetzen der zeichen durch punkte wie das Tutorial es vorgeschlagen hat geändert trotzdem bekomme ich eine Fehlermeldung beim compieleren hier ist der code:

Code: Alles auswählen

#include <stdio.h>
 
void dots( char * string )
{
  unsigned int pos = 0;
	
  while( string[ pos ] )
  {
    string[ pos ] = '.';  
    pos = pos + 1;
  } 
}
 
unsigned int strLength( char * string )
{
  unsigned int length = 0;
 
  while( string[ length ] )
    length = length + 1;
 
  return length;  
}
 
int main( void )
{
	char const array[] = "proggen.org"; 
	unsigned int length = strLength( "aaaaaaaaaaaa" );

	printf( "Der Text ist %d Zeichen lang.\n", length );

	dots(array);
	
	printf( "Der Text ist nach dots() nun: %s\n", array );

	return 0; 
}
Die funktion dots funktioniert hiermit immer noch nicht. Zeigt den in der FUnktion dots der pointer string auf die Adresse von array oder wohin?

Ich hoffe ihr könnt mir weiterhlefen.
Tut mir leid für den langen Text wollte meine Fragen versuchen deutlcih zu erklären :) .

Viele Grüße
Ramnad

Nemo
Beiträge: 37
Registriert: Sa Mär 02, 2013 3:18 pm

Re: Frage zum C-Tutorial Kapitel Zeiger und Attribute

Beitrag von Nemo » Do Okt 29, 2015 4:48 pm

Hallo und Willkommen!

Das mit den Zeigern hast du absolut richtig verstanden. Ich habe ehrlich gesagt noch nie darüber nachgedacht, wieso das mit den Zeichenketten so funktioniert, aber ich habe zumindest eine Idee:
Die Zeichenkette müsste sich meiner Meinung nach im Programmcode selbst befinden. Da dieser bei der Ausführung des Programms in den Arbeitsspeicher geladen wird hat das Programm darauf Zugriff. Dabei handelt es sich vermutlich um eine Ausnahme die nur für Zeichenketten(C-Strings) gilt, um das ganze für den Programmierer einfacher zu machen.

Das Problem mit deinem Programm wird soweit ich mich erinnere erst im C++ Tutorial erklärt. Die einfache Lösung: Verwende kein "const". Bei den kleinen Programmen, die du im Moment schreibst brauchst du es nicht.
Die lange Erklärung: "const" hat keinerlei Auswirkungen sobald das Programm Kompiliert ist. Seine einzige Aufgabe ist es, denn Compiler meckern zu lassen, sobald eine mit "const" gekennzeichnete Variable verändert werden soll. Dies ist praktisch, da man den Funktionen manchmal nur eine Leseberechtigung und keine Schreibberechtigung geben will und gerade bei großen Projekten mit mehreren Programmierern nicht wissen kann, was jede einzelne Funktion genau macht.

Verwende also einfach:

Code: Alles auswählen

char array[] = "proggen.org";
statt

Code: Alles auswählen

char const array[] = "proggen.org";

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum C-Tutorial Kapitel Zeiger und Attribute

Beitrag von Xin » Fr Okt 30, 2015 1:08 am

Moin Ramnad,
Ramnad hat geschrieben: warum ist dann

Code: Alles auswählen

char * text = "proggen.org";
//bzw.
char const * text = "proggen.org";
ein korrekter code. Liegt denn eine Zeichenkette irgendwo im Speicher?
Die Zeichenkette wird mit in das Programm kompiliert. Die Zeichenkette ist wie das Programm unveränderter, das heißt, ein (char *) kann nicht auf sie zeigen, denn (char *) besagt ja, dass man das Ziel verändern darf.
Du musst sie also entweder auf (char const *) zuweisen oder auf ein Array (char []) kopieren.
Ramnad hat geschrieben: Ich habe das programm zum festellen der zeichenlänge und zum ersetzen der zeichen durch punkte wie das Tutorial es vorgeschlagen hat geändert trotzdem bekomme ich eine Fehlermeldung beim compieleren
Bitte die Fehlermeldung immer mitkopieren :)
Ramnad hat geschrieben:

Code: Alles auswählen

void dots( char * string )
unsigned int strLength( char * string )
 
int main( void )
{
	char const array[] = "proggen.org"; 
	unsigned int length = strLength( "aaaaaaaaaaaa" );
...}
Dots braucht einen Zeiger auf veränderbare Buchstaben, denn Du willst damit ja eine Zeichenkette verändern. Dafür musst Du einen Zeiger auf eine veränderbare Zeichenkette übergeben.
Array ist ein konstantes Array, die Zeichenkette wird also aus dem Programm kopiert und ab da darf sie nicht mehr verändert werden. Entsprechend kannst Du array nicht an dots() übergeben, da dots() den Parameter verändern möchte.

Bei strLength() hingegen willst Du die Zeichenkette nicht verändern. Du kannst also einen Zeiger auf konstante Buchstaben übergeben. Deine strLength()-Funktion verlangt aber (char *) als Parameter.
Ramnad hat geschrieben:Die funktion dots funktioniert hiermit immer noch nicht. Zeigt den in der FUnktion dots der pointer string auf die Adresse von array oder wohin?
Ja, array ist eine Adresse, die auf den ersten Buchstaben zeigt. Diese Adresse wird auf string kopiert, so dass string und array den identischen Wert besitzen.
Ramnad hat geschrieben:Ich hoffe ihr könnt mir weiterhlefen.
Tut mir leid für den langen Text wollte meine Fragen versuchen deutlcih zu erklären :) .
Besser mehr Text als unbrauchbare Fragen :)
Und in Zukunft bitte die Compilerausgaben dazu packen.

Viel Spaß beim Weiterlernen!
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Ramnad
Beiträge: 12
Registriert: Do Okt 29, 2015 3:10 pm

Re: Frage zum C-Tutorial Kapitel Zeiger und Attribute

Beitrag von Ramnad » Fr Okt 30, 2015 11:14 am

Hi danke für eure ausführlichen Antworten das hat mich schon mal weitergebracht :D
Das mit dem Programm habe ich verstanden danke und in Zukunft kommt auch die Fehlermeldung mit

Nur noch eine Frage zu den Zeigern.
Verstehe ich das richtig, wenn ich also eine Zeichenkette an ein char-array übergebe dann müsste ja die Zeichenkette 2-mal im Speicher auftauchen, einmal da wo das Programm steht, denn dahin kann ich ja mit einem Zeiger zeigen und einmal im array. Einziger unterschied zwischen den beiden wäre dann das die Zeichenkette im array veränderbar ist und die andere nicht.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum C-Tutorial Kapitel Zeiger und Attribute

Beitrag von Xin » Fr Okt 30, 2015 11:40 am

Ramnad hat geschrieben:Verstehe ich das richtig, wenn ich also eine Zeichenkette an ein char-array übergebe dann müsste ja die Zeichenkette 2-mal im Speicher auftauchen, einmal da wo das Programm steht, denn dahin kann ich ja mit einem Zeiger zeigen und einmal im array. Einziger unterschied zwischen den beiden wäre dann das die Zeichenkette im array veränderbar ist und die andere nicht.

Code: Alles auswählen

void func( unsigned int x )
{
  char buffer[] = "Hello World";

  if( x < sizeof( buffer ) )
    buffer[x] = ".";

  puts( buffer );
}
Die Funktion gibt "Hello World" auf dem Bildschirm aus und ersetzt eine angegebene Position mit einem '.'. func(2) gibt also "He.lo World" aus.

Machen wir das mal:

Code: Alles auswählen

int main( void )
{
  func( 2 );
  func( 6 );
}
Die Ausgabe ist nun

Code: Alles auswählen

He.lo World
Hello .orld
Damit das funktioniert, darf der String "Hello World" im Programm nicht verändert werden. buffer wird mit einer Kopie des String initialisiert und so ist - während func() läuft zwei Kopien im Speicher von "Hello World" - eine konstante und eine beschreibbare. Die beschreibbare wird verändert, ausgegeben und vernichtet.
Beim zweiten Aufruf wird aus dem konstanten Original wieder eine identische Kopie erzeugt, die wieder verändert werden darf.
Dafür müssen wir das Original aufbewahren und dürfen es nicht verändern.

Das gilt nicht nur für einzelne Funktionen, sondern für ganze Programme.
Ein Programm kann auch im Speicher verbleiben und wiederholt ausgeführt werden - zum Beispiel in Form einer DLL. Auch hier muss man sich darauf verlassen können, dass gewisse Daten unverändert bleiben und wiederverwendet werden können. Wenn ein "Hello World" abnutzen würde, wäre es ja kein zuverlässiges Programm. ;)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Ramnad
Beiträge: 12
Registriert: Do Okt 29, 2015 3:10 pm

Re: Frage zum C-Tutorial Kapitel Zeiger und Attribute

Beitrag von Ramnad » Sa Okt 31, 2015 2:46 am

ahaaa ok das ist ein super beispiel das erklärt so einiges :D :D

Vielen Dank für die Mühe und den Aufwand zum erklären echt gut
Jetzt kann ich erleuchtet weiter machen. :mrgreen:

Antworten