WinFuture-Forum.de: Noobie Frage In C ! - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Noobie Frage In C !

#16 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.505
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 09. Mai 2005 - 19:15

Zitat

*( ptr1 + 5 ) = 'B';
das sollte doch das gleiche sein : s[i] = *(s + i)
ist es aber irgendwie nicht ...


Nein. s[i]=*(s+i*sizeof(type(s)))

Und auch das ist nicht garantiert, s[i] kann gar irgendwo im Speicher liegen.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

Anzeige



#17 Mitglied ist offline   SciFi 

  • Gruppe: Mitglieder
  • Beiträge: 4
  • Beigetreten: 14. April 05
  • Reputation: 0

geschrieben 17. Mai 2005 - 00:12

irgendwie wurde seine frage immer noch nicht so richtig beantwortet.

er wollte ja mit pointern arbeiten und nicht mit arrays. vielleicht ja zur übung und wenn er immer nur arrays verwendet lernt erst nie :D

also ein beispiel wo man auch reinschreiben kann und das nicht readonly ist:
#include <stdio.h>
#include <stdlib.h>


int main()
{
    char *a;

    if ((a = malloc(10 * sizeof(char)) == NULL) // prüfen ob der speicher reserviert werden kann
    {
          printf("Konte keinen Speicher für a reservieren.\n");
          return 1;
     }

    strcpy(a, "10zeichen");     // ja, dies ist ein paradoxon :P

    a[5] = 'a';

    printf("%s\n", a);
    printf("Adresse von a: 0x%p\n", a); // noch adresse zum angucken (ausserdem siehts cool aus)

    free(a); // free nicht vergessen
    a = NULL;  // wenn das proggy noch weiter ginge keine schlechte idee

    printf("Hello, world!\n");  // zu guter letzt noch unser altbekanter freund;)

    return 0;
}


ich weiss, ist ein wenig spät, aber dient vielleicht auch noch anderen lesern. und wenn ein fehler drinn ist... ich habs nicht kompiliert und getestet sondern einfach hier reingeschrieben :D
0

#18 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.505
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 17. Mai 2005 - 00:32

Hehe, 3 kleine Fehler.
1. Was machst du, wenn free(a) fehlschlägt? Und dann noch den Pointer wegschmeissen... Memory Leak :D
2. Was ist mit Unicode-Strings? Oder Multibyte-Charset? Memory Access Error. Nimm lieber strncopy mit Zusatzparameter length=10.
3. Du hoffst darauf, daß "NULL == NULL" wahr ist - mit -ANSI -pedantic ist das nicht der Fall, und so ist's eigentlich auch recht. "== NULL" ist eigentlich per Definition immer falsch, da NULL von allen gültigen Pointern verschieden ist; man möge "foobar Is NULL" verwenden.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#19 Mitglied ist offline   SciFi 

  • Gruppe: Mitglieder
  • Beiträge: 4
  • Beigetreten: 14. April 05
  • Reputation: 0

geschrieben 17. Mai 2005 - 01:00

ja stimmt, das proggy ist voller fehler. verzeih mir :/
0

#20 Mitglied ist offline   [U]nixchecker 

  • Gruppe: aktive Mitglieder
  • Beiträge: 345
  • Beigetreten: 17. Mai 05
  • Reputation: 0
  • Wohnort:Bayern
  • Interessen:Informatik, Linux, Rollerbladen, Bodybuilding, GungFu

geschrieben 17. Mai 2005 - 02:50

Dein Problem liegt hier:

char *ptr1 = "10 spaces";

und zwar macht die folgende Anweisung nix anderes als den Zeiger auf ein konstante Zeichenkette zu setzen, du weist was das bedeutet?
Du kannst die Zeichenkette im nachhinein nicht ändern, du kannst nur den Wert lesen nicht schreiben.

Z.B. würde printf("Wert: %c", ptr1[5])

a ausgeben, was korrekt ist.
Was du machen kannst ist, dass du den ptr jetzt auf eine andere Zeichenkette Zeigen lässt. Deswegen funktioniert es wieder, wenn du:

ptr="OK"

setzt.

Daher funktioniert das nicht was du vorhast und wer immer dein cooles Skript erstellt hat ist eine absolute Pflaume.
Ich hoffe du hast den Unterschied jetzt kapiert.
0

#21 Mitglied ist offline   guard 

  • Gruppe: Mitglieder
  • Beiträge: 6
  • Beigetreten: 22. April 05
  • Reputation: 0
  • Interessen:C/C++<br />SDL<br />GTK

geschrieben 17. Mai 2005 - 09:46

@[U]nixchecker: Ich dachte wir haben das mit der Konstante schon mal erklärt *grübel* :D

@SciFi: zu deinem malloc-Aufruf noch was: sizeof( char ) ist immer 1 - nur mal so am Rande bemerkt :D

So long ...
0

#22 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.505
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 17. Mai 2005 - 13:15

Nicht wenn du AutoConvert: char-> wchar_t im Compiler aktiviert hast.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#23 Mitglied ist offline   guard 

  • Gruppe: Mitglieder
  • Beiträge: 6
  • Beigetreten: 22. April 05
  • Reputation: 0
  • Interessen:C/C++<br />SDL<br />GTK

geschrieben 17. Mai 2005 - 20:54

Zitat (Rika: 17.05.2005, 14:15)

Nicht wenn du AutoConvert: char-> wchar_t im Compiler aktiviert hast.
<{POST_SNAPBACK}>

sizeof( char ); ist laut Standard immer 1, auch wenn char > als 8 Bits.
Laut K&R, wenn der sizeof()-Operator auf char angewendet, ist das Resultat 1.
Sagt dein Compiler etwas Anderes, dann ist er IMHO nicht standardkonform.

MfG

edit: Habe mal im Final Draft nachgeschlagen:

Final Draft Seite 81 sagte:

When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1. When applied to an operand that has array type, the result is the total number of bytes in the array.75) When applied to an operand that has structure or union type, the result is the total number of bytes in such an object, including internal and trailing padding.

Dieser Beitrag wurde von guard bearbeitet: 18. Mai 2005 - 06:22

0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0