Zum Inhalt springen

haddock

Mitglieder
  • Gesamte Inhalte

    173
  • Benutzer seit

  • Letzter Besuch

    Nie

Beiträge von haddock

  1. namespaces sind ein weiterer Weg, in C++ Namenskonflikte zu vermeiden.

    stell dir vor, in einem großen Projekt schreibt P1 eine Funktion tuwas und P2 tut das auch. Jetzt ist natürlich nicht klar, welche der beiden gemeint ist, wenn man tuwas() aufruft...

    Also kann P1 schreiben:

    namespace p1

    {

    void tuwas()...

    }

    und dann ist klar, daß ein Aufruf der Form entweder

    p1::tuwas();

    oder

    using namespace p1;

    tuwas();

    die tuwas() von P1 aufruft. In C++ sind viele Dinge im namespace std definiert, damit klar ist, daß es sich um Standard-Sprachmerkmale handelt.

    Du kannst die using-Direktive auch weglassen und stattdessen den namespace immer mit angeben :

    std::cout << "hihi" << std::endl;

  2. 
    #include <iostream>
    
    using namespace std;
    
    
    #define X 30
    
    
    void main(void)
    
    {
    
    	char buffer[X][X];
    
    	int i = 0;
    
    
    	do
    
    	{
    
    		cin.getline(buffer[i++], X);
    
    	}
    
    	while((strcmp(buffer[i-1],"")) && (i < X) ); //   
    
    
    	while(i)
    
    		cout << buffer[--i] << endl;
    
    } [/code]
    
    
    
    
    Jetzt mußt du nur noch mit dem Problem umgehen, daß der Benutzer
    
    
    
    wort1 <enter>
    
    
    
    aber auch
    
    
    
    wort2 wort3 <enter>
    
    
    
    eingeben kann...
    
    ...dann mußt du noch die einzelnen Wörter aus den Strings pulen.
    
    
    
    Alternative:
    
    du liest Zeichenweise ein und brichst bei '\n''\n' ab:
    
    
    
    
    [code] while(1) { //... if( (c=cin.get()) == '\n') { if(cin.peek() == '\n') break; // zweimal <enter> hintereinander } //... }

    Dann mußt du "nur" die whitespaces zwischen den Wörtern wegschmeißen und an den Wortgrenzen zum nächsten Array-Element weitergehen :)

    (Ich weiß, while(1) mit break ist immer so 'ne Sache... :cool: )

    <FONT COLOR="#a62a2a" SIZE="1">[ 19. Oktober 2001 12:23: Beitrag 1 mal editiert, zuletzt von captain haddock ]</font>

  3. Wenn ich mich erinnere, arbeitest du mit MSVC. Dann markier doch mal "getline" und drück F1. Wenn deine Firma eine anständige Installation hat, sollte die MSDN Library aufgehen, wo du dir anschauen kannst, wie z.B. getline deklariert ist (es braucht mindestens 2 Parameter :) ).

    Das heißt nicht, daß ich es dir nicht auch verraten könnte, aber es geht oft schneller ;)

    <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>

    istream& getline( char* pch, int nCount, char delim = '\n' );

    pch : A pointer to a character array.

    nCount : The maximum number of characters to store, including the terminating NULL.

    delim : The delimiter character (defaults to newline).

    Remarks

    Extracts characters from the stream until either the delimiter delim is found, the limit nCount?1 is reached, or end of file is reached. The characters are stored in the specified array followed by a null terminator. If the delimiter is found, it is extracted but not stored.

  4. Tja, ein trickiges Problem das damit zusammenhängt wie cin funktioniert. In der Form cin >> charbuf wird halt immer das nächste Stück zusammen hängender nicht-Leerzeiche eingelesen, kommt dieses nicht, bleibt in charbuf der alte Inhalt...

    Eine Lösung wäre, die gesamte Zeile einzulesen mit istream::getline. Dann wird nämlich alles eingelesen, auch wenn nichts vor <enter> kommt wird dieses nichts eingelesen. Aus diesem string kann dann, wenn er nicht leer ist, mit einem strstream gelesen werden.

    Oder du läßt dir die Suchbegriffe in einer Zeile geben. Probier mal dieses:

    #include <iostream>

    using namespace std;

    void main(void)

    {

    char buffer[30][30];

    int i = 0;

    do

    {

    cin >> buffer[i++];

    // Leerzeichen, die ggf. am Ende der Zeile stehen, entfernen, sonst evt. Problem...

    while( (isspace(cin.peek())) && ( cin.peek() != '\n') )

    cin.get();

    }while( cin.peek() != '\n' );

    // Nur um zu schauen, was in buffer so drin ist:

    while(i)

    cout << buffer[--i] << endl;

    }

    (Es gibt immer noch eine andere Lösung, als man denkt :) )

    <FONT COLOR="#a62a2a" SIZE="1">[ 19. Oktober 2001 09:53: Beitrag 1 mal editiert, zuletzt von captain haddock ]</font>

  5. Ich denke da sollte es kein Problem geben, da Oracle selber schon Zugriffschutz bietet. Je nachdem, wie der Zugriff aussieht - lesend oder schreibend - ist ja auch kein Schutz notwendig. Aber Oracle wird bestimmt dafür sorgen, daß keine zwei user gleichzeitig denselben Datensatz bearbeiten können, dafür gibt es locks auf Zeilen- und Tabellenebene und darüber hinaus eine Transaktionsverwaltung.

    Ist das eine Produktionsdatenbank oder habt ihr auch ein Testsystem, in letztem Fall würde ich einfach mal versuchen, den GAU auszulösen. Nach dem, was ich über Oracle gelernt habe, sollte dir das nicht gelingen :)

    <FONT COLOR="#a62a2a" SIZE="1">[ 19. Oktober 2001 08:43: Beitrag 1 mal editiert, zuletzt von captain haddock ]</font>

  6. Das ist ja sehr merkwürdig. Ich habe mal folgendes probiert:

    // *** pfil.cpp ***

    // wie ist das mit FILE* ?

    #include <stdio.h> // hast du dieses include?

    void func(FILE* fil)

    {

    int c = fgetc(fil);

    putchar©;

    }

    void main(void)

    {

    FILE* f;

    if( f = fopen("x.txt","r") ) // x.txt muß es natürlich geben ;)

    {

    func(f);

    fclose(f);

    }

    }

    Das kompiliert bei mir sowohl unter M$, gcc wie auch borland anstandslos !?! :)

    <FONT COLOR="#a62a2a" SIZE="1">[ 19. Oktober 2001 08:53: Beitrag 1 mal editiert, zuletzt von captain haddock ]</font>

  7. <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

    <STRONG>Also, habe jetzt alle Variablen die ich nur in der Funktion 'Ueberpruefung' brauche dort definiert. Habe jetzt noch fünf Parameter (ging leider nicht weniger, da ich die anderen Sachen auch noch verändert in 'main' brauche.

    </STRONG>

  8. (1)

    Arrays sind immer von einem einzigen Typ.

    (2)

    Arrays sind immer statisch

    Lösung:

    (1)

    definiere dir strukturen mit deinen gewünschten Datentypen, BSP (und das ist nur ein Beispiel, was deiner Problemstellung bestimmt nicht gerecht wird):

    struct auftrag

    {

    int auftragsnummer;

    char* kundenname;

    int[] posnr;

    int[] artikelnr;

    int[] menge;

    };

    (2)

    dynamische Datenstrukturen mit C sind z.B. linked lists.

    Du wirst allerdings nicht mit einer einfachen Liste hinkommen, mach dich mit dem relationalen Datenmodell vertraut und versuch es unter C abzubilden, wenn du dich mit linked lists angefreundet hast :)

    auf spezielle Fragen gibts auch speziellere Antworten...

  9. Also:

    void XY(char* axy, char* bxy, char** cxy, int* dxy)

    {

    // Zugriff innerhalb:

    *axy = 'm';

    strcpy(bxy, "hohi");

    bxy[1] = 'i';

    strcpy(cxy[0], "eh-oh");

    cxy[0][0] = 'o';

    *dxy = 42;

    }

    Aufruf:

    XY(&a, b, c, &d);

    Der Haken sind die char-Arrays, bzw. Arrays davon. Leider werden in C Strings als nullterminierte Arrays von char dargestellt, weswegen die ersten beiden Parameter, obwohl scheinbar gleichen Typs, etwas Grundlegend unterschiedliches sind.

    axy ist tatsächl ich ein Zeiger auf ein char, weswegen er im Funktionsrumpf dereferenziert werden muß.

    bxy dagegen ist die Startadresse eines char-Arrays, die Dereferenzierung findet durch den [] Operator statt. Eigentlich (verzeihung, daß ich erst jetzt darauf komme :rolleyes: ) kannst du auch wie folgt deklarieren:

    void XY(char* axy, char[] bxy, char[][] cxy, int* dxy);

    Dadurch ändert sich nichts, allerdings ist es vielleicht einleuchtender...

    Noch zur Verwendung von char-Arrays, hast du diesen thread schon gelesen, da steht vielleicht auch ein bißchen Nützliches.

    <FONT COLOR="#a62a2a" SIZE="1">[ 17. Oktober 2001 12:53: Beitrag 1 mal editiert, zuletzt von captain haddock ]</font>

  10. Nur halb, der Typ des Parameters muß stimmen. Wenn du sagst

    char arrggh[7][7];

    ist der Typ von arrggh[0][0] char,

    der von arrggh[0] ist char* (Zeiger auf char)

    und der von arrggh ist char** (Zeiger auf Zeiger auf char).

    Folgender Fall:

    void a(char* x)

    {...}

    void b(char** y)

    {...}

    void main()

    {

    char arr[3];

    char arrarr[2][4];

    a( arr );

    a( arrarr[1] );

    b( &arr );

    b( arrarr );

    ...

    }

    Für jede zusätzliche Dimension des Arrays muß auch eine weitere Indirektion des Zeigers erfolgen, damit der Typ immer stimmt. Ich weiß, das ist Anfangs hartes Brot...

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...