www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Englisch
  Status Grammatik
  Status Lektüre
  Status Korrekturlesen
  Status Übersetzung
  Status Sonstiges (Englisch)

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Formale Sprachen" - C - unsigned char
C - unsigned char < Formale Sprachen < Theoretische Inform. < Hochschule < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Formale Sprachen"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

C - unsigned char: Funkionen für unsigned char?
Status: (Frage) beantwortet Status 
Datum: 14:13 Mi 25.07.2007
Autor: misterET

HALLO!!
Ich brauch ganz dringend Hilfe:
Hier ein kleines Bsp:

unsigned char string[10]="HALLO";

Soooo, diesen String möchte ich jetzt in einer vordefinierten Funktion aus <string.h> benutzen.

Wenn ich zb. den Befehl "puts(string)" eingebe, wird gemeckert, da die Funktion auf ein char zeigt, also signed char.


Um in Dateien zu schreiben, benötige ich den Befehl "fprintf". Der klappt auch nur bei char, aber nicht bei unsigned char.


Kann ich in einer Funktion dennoch irgendwie einen unsigned char verwenden???????

        
Bezug
C - unsigned char: Antwort
Status: (Antwort) fertig Status 
Datum: 17:08 Mi 25.07.2007
Autor: rainerS

Hallo misterET,

bevor ich deine Frage beantworte, erst einmal ein paar Bemerkungen. Die kommen aus langjähriger Erfahrung mit der Sprache C.

> unsigned char string[10]="HALLO";

Warum benutzt du unsigned char? Das Array "HALLO" besteht aus Elementen des Typs char, nicht unsigned char. Die Zuweisung wandelt also char in unsigned char um.

> Soooo, diesen String möchte ich jetzt in einer
> vordefinierten Funktion aus <string.h> benutzen.

In C gibt's keine Strings, nur Arrays. ;-)

> Wenn ich zb. den Befehl "puts(string)" eingebe, wird
> gemeckert, da die Funktion auf ein char zeigt, also signed
> char.

char ist nicht derselbe Typ wie signed char (oder unsigned char). Je nach Maschinentyp und Implementation verhält sich char eigentlich immer wie signed char oder unsigned char. Welches von beiden der Fall ist, muss man nachlesen.

Die Typumwandlung passiert mit einem Type Cast, das ist eine Typenbezeichung in Klammern. Aber das ist gefährlich, denn wenn char sich wie signed char verhält, kann eine Variable vom Typ unsigned char  eine Zahl aufnehmen, die nicht in eine Variable vom Typ char passt.

Beispiel:
  unsigned char:  0 .. 255
  char         :  -128 .. 127

> Kann ich in einer Funktion dennoch irgendwie einen unsigned
> char verwenden???????

Zum Beispiel mit

  strlen((char *) string)

Aber mein Rat: tu's nicht! Deklariere statt dessen:

char string[10] = "HALLO";

Grüße
  Rainer

Bezug
                
Bezug
C - unsigned char: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 17:18 Mi 25.07.2007
Autor: misterET

Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)

Ja mein Problem ist folgendes:
Ich habe die Aufgabe, eine SMS zu komprimieren. Dazu habe ich 36 Zeichen (Zahlen, Buchstaben) in 6bit Code codiert.

Jetzt schreibe ich eine SMS und reihe die 6bit-Codierungen aneinander. Dann nehme ich mir immer 8bit heraus, und berechne den Zahlenwert. Diesen interpretiere ich dann als ASCII Zeichen. Die ASCII Zeichen gehen von 0-255.

Diese muss ich also in einem unsigned character speichern.

Und diesn array muss ich dann in eine Textdatei speichern.

datei1 = fopen ("kompression2.txt", "w");
fprintf(datei1, ausgabe);
//An die Funktion muss ein char übergeben werden. Übergabe von unsigned char führt zu Fehlermeldung.
Die richtige Komression ist jedoch in einem unsigned char gespeichert...


fprintf(datei1, "\n\n");
fprintf(datei1, "Kompressionsstärke beträgt: ");
fprintf(datei1, "%d", prozent);
fprintf(datei1, "%%");
fclose (datei1);
}


Bezug
                        
Bezug
C - unsigned char: Antwort
Status: (Antwort) fertig Status 
Datum: 17:47 Mi 25.07.2007
Autor: rainerS

Hallo,

> Ja mein Problem ist folgendes:
>  Ich habe die Aufgabe, eine SMS zu komprimieren. Dazu habe
> ich 36 Zeichen (Zahlen, Buchstaben) in 6bit Code codiert.
>  
> Jetzt schreibe ich eine SMS und reihe die 6bit-Codierungen
> aneinander. Dann nehme ich mir immer 8bit heraus, und
> berechne den Zahlenwert. Diesen interpretiere ich dann als
> ASCII Zeichen. Die ASCII Zeichen gehen von 0-255.

ASCII geht per Definition nur von 0-127. Die Zeichen ab 128 gehören streng genommen nicht zu ASCII.

> Diese muss ich also in einem unsigned character speichern.

Oder in einem int. unsigned char bietet keinen Vorteil.

> Und diesn array muss ich dann in eine Textdatei speichern
>  
> datei1 = fopen ("kompression2.txt", "w");
>  fprintf(datei1, ausgabe);
>  //An die Funktion muss ein char übergeben werden. Übergabe
> von unsigned char führt zu Fehlermeldung.
>  Die richtige Komression ist jedoch in einem unsigned char
> gespeichert...

Wenn ich das richtig verstehe, kommen alle 256 möglichen Bitkombinationen vor. Dann kannst du es nicht in einer Textdatei speichern. Es muss ja nur die Zahl 0 vorkommen, dann hört fprintf an dieser Stelle auf.

Folgendes ginge, wenn laenge die Anzahl der 8Bit-Objekte enthält:
1: datei1 = fopen ("kompression2.txt", "wb");
2: for (i=0; i<laenge; i++) {
3:    fputc(ausgabe[i],datei1);
4: }

Der erste Parameter von fputc ist vom Type int, dann kannst du auch gleich int statt unsigned char nehmen.

> fprintf(datei1, "\n\n");
>  fprintf(datei1, "Kompressionsstärke beträgt: ");
>  fprintf(datei1, "%d", prozent);
>  fprintf(datei1, "%%");

Einfacher:

fprintf(datei1,"\n\nKompressionsstärke beträgt: %d%%\n", prozent);

Grüße
  Rainer


Bezug
                                
Bezug
C - unsigned char: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 18:51 Mi 25.07.2007
Autor: misterET

Mhh, also ich woll ja in der Textdatei keine Zahlen - sondern einen komprimierten Text speichern. Also muss ich doch irgendwie diese Zeichen übergeben.....und diese Zeichen haben eben "Zahlenwerte" von 0-255, also handelt es sich um unsigned character.

Ich glaube es klappt nicht mit dieser Funktion oder :( ?

Bezug
                                        
Bezug
C - unsigned char: Antwort
Status: (Antwort) fertig Status 
Datum: 20:08 Mi 25.07.2007
Autor: rainerS

Hallo,

> Mhh, also ich woll ja in der Textdatei keine Zahlen -
> sondern einen komprimierten Text speichern. Also muss ich
> doch irgendwie diese Zeichen übergeben.....und diese
> Zeichen haben eben "Zahlenwerte" von 0-255, also handelt es
> sich um unsigned character.

Es gibt in C keine Zeichen im engeren Sinn. Das sind alles Zahlen. 'A' ist nichts anderes als die Zahl 65.

unsigned char ist ein Datentyp, der (mindestens) ganze Zahlen im Bereich von 0-255 speichern kann.

Insofern kannst du natürlich deine 8 Bit langen Bytes darin speichern. Aber es macht keinen Unterschied, ob du unsigned int, int, unsigned short oder unsigned char benutzt.

Der entscheidende Punkt ist, dass diese Bytes kein Text sind, sondern binäre Daten:

1. Es kann 0 vorkommen. Wäre es Text, würde das 0-Byte das Ende des Textes markieren. Du hast also keine Markierung in deinem Array, die das Ende der Daten bezeichnet. Deswegen solltest du die Anzahl der Bytes in einer Variablen speichern und sie einzeln mit fputc in deine Ausgabedatei speichern. (das meinte ich mit der Variablen laenge)

2. Es kann 10 (Linefeed [mm] \n) [/mm] vorkommen. Dies ist ein Steuerzeichen, das bei der Textaus- und -eingabe je nach Betriebssystem unterschiedlich behandelt wird: in Linux wird das Byte 10 geschrieben, auf einem Mac das Byte 13, auf Windows die zwei Bytes 13 und 10. Deswegen musst du beim fopen nicht "w", sondern "wb" angeben, damit werden alle Bytes ohne Interpretation in die Ausgabedatei geschrieben.

Das sind zwei Beispiele für Bytes, die in Texten spezielle Bedeutung haben bzw gar nicht vorkommen. Es gibt noch mehr, in der Regel sind dies alle Bytes im Bereich 0..31.

Wenn du dann deine SMS verschicken willst, musst du eine binäre Nachricht schicken, denn der  []einfache SMS-Zeichensatz hat nur 7 Bit.

Grüße
  Rainer

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Formale Sprachen"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.englischraum.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]