Zum Inhalt springen

hoagi

Mitglieder
  • Gesamte Inhalte

    109
  • Benutzer seit

  • Letzter Besuch

Beiträge von hoagi

  1. Hi,

    um wirklich eine gue Lösung für dein Problem zu geben, gibst du zuwenig Informationen.

    Wofür brauchst du diesen Wert?

    Aber es gib mehere Möglichkeiten.

    z.B.:

    Erstelle eine neue Klasse, abgeleitet von CDialog und füge ein statische Variable in die Klasse ein , die du entweder public machst oder über eine statische public-Funktion von aussen zugängig machst.

    Oder du fügst in die Klasse einen Konstruktor ein mit dem du den Wert der Variable setzt.

    Du kannst natürlich einfach auch den Wert einer nichtstatitschen Variable setzen nach Aufruf des Konstruktors und vor dem Aufruf DoModal()

    z.b:

    pDlg = new CMyDialog;

    pDlg->SetzeWert( irgendwas );

    pDlg->DoModal();

    Vielleicht stellst du einfach den Code, der bei dir den Speicherfehler erzeugt hier ins Board.

  2. Mal ne dumme Frage:

    Wo holt man sich als 16 jähriger Hauptschüler

    so viel Erfahrungen

    Englisch sehr gut.

    sehr gute Kenntnisse in Win 9.x,Me,2000 Advanced Server, WinXP Pro., Linux und Unix.

    Fundierte Netzwerkkenntnisse in TCP/IP, IPX/SPX, LAN, Intranet

    Programmierkenntnisse in Pascal,C,C++,Delphi,HTML,Java

    Datenbankkenntnisse in Accses,DBASE,Oracle8, SQL,MySQL

    oder seid ihr in der Schule so gut bestückt?

  3. Also entweder die Linuxrechner als Gateway eintragen

    unter Eigenschaften des Netzwerk -> TCP/IP

    hier den Gateway eintragen

    oder eine statische Route eintragen.

    zum Beispiel im 10er Netz:

    route add 192.168.0.0 mask 255.255.255.0 10.10.10.1

    in der Eingabeaufforderung der Clientrechner.

    Das sich Rechner sich trotz fehlender Route im Netz sehen, lässt sich übrigens dadurch erklären, daß der Sambaserver

    wahrscheinlich als Local Master Bowser dient und Namensregistrierungen aus beiden Netzen erhällt und diese auch in beide Netze weiterleitet.

    Hoagi

  4. Das ist in dem Fall kein Adressoperator sondern ein Referenz operator.

    Der Funktion wird als Parameter eine Reference auf Objekt vom Typ demo übergeben.

    Es wird also nicht wie beim normalen call by Value der Wert des Objektes( also ne Kopie des Objekts) sondern das Objekt selber übergeben.

    Zwei Gründe hierfür:

    Erstens die Aufgerufende Funkktion kann das Objekt des Aufrufers ändern ( wenn erwünscht ).

    Zweitens wenn du mit großen Objekten ( viele Elemente in einer Klasse ) arbeitest kann es sein daß du eine große Menge von Daten auf den Stack kopieren mußt um ein Objekt als Wert zu übergeben.

    Zudem werden bei Kopieren die Elemente Memberweise kopiert

    ( das heist es wird nicht einfach der Speicherbereich kopiert ).

    Dadurch kann die ganze Sache auch sehr zeitintensív werden,

    denn es werden nicht nur die Kopierfunktionen des eigentlichen Objekts aufgerufen sondern auch von seinen Membern.

    Also

    Demo * pD = &d ; // in dem Fall ist & Adressoperator

    Demo &rD = d; // In dem Fall dient & als Referenzoperator

    Nich verwechseln.

    Hoagi

  5. Na wenn das Program gestartet war

    ( pentagone.exe ) dann ist da auch was Ausführbares auf deinem Rechner, gell.

    Is eventuell als versteckte Datei angelegt dann im Explorer einstellen, das auch versteckte Dateien angezeigt werden.

  6. Wirklich nen interessantes Problem.

    Ich denk mir aber das bei einem C++ Compiler 150 rauskommen muß wenn man mal das folgende aus der Hilfe zu const-Values

    aus dem Visual C++ 6.0 Compiler in Betracht zieht:

    In C++, you can use the const keyword instead of the #define preprocessor directive to define constant values. Values defined with const are subject to type checking, and can be used in place of constant expressions. In C++, you can specify the size of an array with a const variable as follows:

    const int maxarray = 255;

    char store_char[maxarray]; // Legal in C++; illegal in C

    Das kann meiner Meinung eigentlich nur funktionieren, wenn der

    Compiler maxarray als Alias( also wie ein #define für den Wert 255 betrachtet, nur mit dem Unterschied, daß das nicht vom Präprozessor wie ein Textersatz behandelt wird, sondern vom Compiler verarbeitet wird ).

    Witzigerweise lässt sich der Compiler auch nicht von Konstruktionen wie

    nErgebnis = *(&nConstWert) + 50;

    beeindrucken.

    Er schreibt auch hier fest an der Speicherstelle von nErgebnis den

    Wert 150.

    mov dword ptr [ebp-74h],96h

    Hoagi

  7. Hi Crush

    hier geht es um das konkrete Problem der Level-Order-Traversierung:

    Dabei geht es darum alle Knoten des Baumes in einer bestimmten Reihenfolge zu besuchen.

    Immer alle Knoten einer Stufe zu besuchen.

    Dann auf die nächste Ebene, hier alle Knoten besuchen

    usw...

    (Ich wollte hier ein ein kleines Diagram einbinden, aber irgendwie bin da nicht künstlerich genug zu )

    Ich denke, daß der iterative Ansatz ohne Stack nur auskommt, wenn man sich an der Stackstruktur selbst orientiert.

    Stimmt nur , wenn ich den Satz richtig verstehe, wenn ein Stack benötigt wird.

    Im meinem Beispiel nutze ich aber keinen Stack, sondern eine Warteschlange.

    Würde mein Programbeispiel einfach durch einen Stackersetzen.

    Also statt queueempty() , put() und get() die entsprechenden

    stackempty() , push() und pop() - Implementierungen nutzen

    ( und damit zu einer wirklich rekursiven Darstellung kommen )

    hätten wir keine Level-Order -Traversie mehr , sondern eine Preorder - Traversie.

    Also erste linke zweige vorwärst bis zum Ende , dan rechte Zweige rückwärts bis zum Ende´( oder so ähnlich ).

    Ich denke Rekursion ist ne schöne Sache, aber es gibt Behandlungen von Datenstrukturen, die nicht rekursiv sind.

    PS:

    Mit Leerzeichen vorder Zeile meine ich übrigens das Einrücken des Codes im Text.

    Hoagi

  8. Hi Crush,

    wahrscheinlich kann alles irgendwie rekursiv dargestellt werden.

    Die Frage ist narürlich ob wir ein originär rekursives Problem haben, oder nicht.

    Die andere Frage ist ob deine rekursive Lösung wirklich das gleiche Ergebniss hat wie das Iterative.

    Die Antwort auf die ersten Frage kann meiner Meinung dadurch entschieden werden, ob für das Programm eine Stackstruktur notwendig ist.

    Dadurch das sich das Problem durch eine Warteschlange lösen lässt denke ich mal das das Problem kein rekursives ist

    ( ich möchte jetzt mal nicht behaupten das es sich rekursiv umstellen lässt )

    Für die zweite Frage habe ich das Program mal ein wenig umgeschrieben.

    EInfach als WIN32 Konsolenprogram kompilieren und starten und du wirst sehen das das Ergebnis ein wirklich anderes ist.

    Die put() -Funktion ist übrigens in deiner Lösung nicht erforderlich.

    // Traverse.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.

    //

    #include "stdafx.h"

    #include <stdlib.h>

    # define DATA struct data

    # define ROOT struct root

    DATA

    {

    DATA *l; /* left eye */

    DATA *r; /* right eye */

    int x;

    };

    DATA *first;

    void erstelle()

    {

    first = (DATA*)malloc( sizeof(DATA) );

    first -> l = NULL;

    first -> r = NULL;

    first -> x = 0;

    }

    DATA *qu[1000];

    long head,tail;

    void put( DATA * r )

    {

    qu[tail++] = r;

    }

    DATA * get()

    {

    return (qu[head++]);

    }

    int quempty()

    {

    return head ==tail;

    }

    void ausgabe( DATA * d )

    {

    printf( "d->x = %d\n",d->x );

    }

    void show( DATA * d )

    {

    head = tail = 0;

    if ( d )

    put(d);

    while( !quempty() )

    {

    d = get();

    ausgabe(d);

    if( d -> l )

    put( d -> l );

    if( d -> r )

    put( d -> r );

    }

    }

    void anmelden(DATA *t, int x)

    {

    DATA *neu,*d;

    neu = (DATA *)malloc( sizeof(DATA) );

    if(first == NULL )

    {

    first = neu;

    neu->l = NULL;

    neu->r = NULL;

    neu->x = x;

    return;

    }

    for( d=first; d; )

    {

    if( x == d->x )

    return;

    if( d->l == NULL )

    {

    d->l = neu;

    neu->x = x;

    break;

    }

    else

    {

    if( d->r == NULL )

    {

    d->r = neu;

    neu->x = x;

    break;

    }

    else

    d = d->l;

    }

    }

    neu->l = NULL;

    neu->r = NULL;

    }

    Leveltrav(DATA * d)

    {

    ausgabe(d);

    if( d->l )

    Leveltrav(d->l);

    if (d->r)

    Leveltrav(d->r);

    }

    void main()

    {

    DATA *t;

    erstelle();

    t = first;

    anmelden(t, 1);

    anmelden(t, 2);

    anmelden(t, 3);

    anmelden(t, 4);

    anmelden(t, 5);

    anmelden(t, 6);

    anmelden(t, 7);

    anmelden(t, 8);

    anmelden(t, 9);

    anmelden(t, 10);

    anmelden(t, 11);

    anmelden(t, 12);

    anmelden(t, 13);

    anmelden(t, 14);

    anmelden(t, 15);

    anmelden(t, 16);

    anmelden(t, 17);

    anmelden(t, 18);

    anmelden(t, 19);

    anmelden(t, 20);

    show( (DATA*)t );

    Leveltrav(t) ;

    /* hier würde ich gerne level für level anzeigen wollen */

    /* z.b in dieser form: show(t); */

    }

    Hoagie

    PS: WIe krieg ich denn nu die Leerzeichen an den Anfang der Zeile.

  9. Laut Robert Sedgewick( Algorithmen in C )

    kann die Leveltraversie mit ein Warteschlage realisiert werden und zwar im Buchbeispiel iterativ und nicht rekursiv

    DATA

    {

    DATA *l; /* left eye */

    DATA *r; /* right eye */

    int x;

    };

    show( DATA * d )

    {

    put(d);

    while( !queueempty() )

    {

    d = get();

    ausgabe(d);

    if( d -> l )

    put( d -> l );

    if( d -> r )

    put( d -> r );

    }

    }

    Keine Hexerei also

    Hoagi

    P.S.

    Mal ne blöde Frage : Wie kriegt man die Leerzeichen am Anfang einer Zeile?

  10. Auch wenn die Fehlermeldung nicht darauf deutet , daß der RAID -Treiber das Problem ist( hier wäre eher eine Kernelpanic Meldung beim mounten der Root Partition zu erwarten )her ein Workaround

    um den eventuellen Treiber nachträglich zu installieren:

    Dumm bei der Lösung ist nur, daß du das System irgendwie zum starten bringen mußt ( Bootdiskette oder ähnliches ).

    In der /etc/rc.config den Eintrag ( wenn noch nicht vorhanden )

    INITRD_MODULES='namedestreibersfuerraid'

    erstellen.

    mit dem Script:

    mk_initrd

    die Initialramdisk erstellen.

    Es wird im /boot - Vezeichnis eine Datei initrd erstellt.

    In der Datei /etc/lilo.conf

    den Eintrag

    initrd=/boot/initrd

    innerhalb deiner Linuxbootsektion

    machen.

    Mit

    lilo

    den Bootloader neu installieren.

    Aber wie gesagt das eigentliche Problem scheint mir woanders dran zu liegen.

    Normalerweise macht das Ganze das Installationprogramm von Suse automatisch.

    Die Susedokumentation spricht bei deiner Fehlermeldung von fehlerhafter Plattengeometrie oder verschobener boot.b.

    Vielleicht reicht es ja schon mit lilo den Loader einfach neu zu installieren.

    Viel Glück

    Hoagi

  11. Hi,

    Liebe Leute was habt ihr den vor.

    Wenn ihr Windows2000 ins Nirwana schicken wollt zieht doch einfach den Netzstecker.

    Umschalten in Realmode ?????????????

    Wenn ihr auf Hardwareadressen zugreifen wollt, müßt ihr das schon Windows 2000 konform machen.

    z.B.:

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

    MmAllocateContiguousMemory

    PVOID

    MmAllocateContiguousMemory(

    IN ULONG NumberOfBytes,

    IN PHYSICAL_ADDRESS HighestAcceptableAddress

    );

    MmAllocateContiguousMemory allocates a range of physically contiguous, cache-aligned memory from nonpaged pool.

    Parameters

    NumberOfBytes

    Specifies the size in bytes of the block of contiguous memory to be allocated.

    HighestAcceptableAddress

    Specifies the highest valid physical address the driver can use. For example, if a device can only reference physical memory in the lower 16MB, this value would be set to 0x00000000FFFFFF.

    Return Value

    MmAllocateContiguousMemory returns the base virtual address for the allocated memory. If the request cannot be satisfied, NULL is returned.

    Comments

    MmAllocateContiguousMemory can be called to allocate a contiguous block of physical memory for a long-term internal buffer, usually from the DriverEntry routine.

    A device driver that must use contiguous memory should allocate only what it needs during driver initialization because nonpaged pool is likely to become fragmented as the system runs. Such a driver must deallocate the memory if it is unloaded. Contiguous allocations are aligned on an integral multiple of the processor’s data-cache-line size to prevent cache and coherency problems.

    Callers of MmAllocateContiguousMemory must be running at IRQL = PASSIVE_LEVEL.

    See Also

    HalAllocateCommonBuffer, KeGetDcacheFillSize, MmAllocateNonCachedMemory, MmFreeContiguousMemory

  12. Hi,

    die command.com ist bei dir für den MSDOS -Modus eingestellt.

    Einfach mit der rechten Maustaste auf die command.com klicken.

    Menupunkt Eigenschaften -> Register Programm -> Button erweitert.

    Den Punkt 'Msdos-Modus' ( nicht Msdos-Modus vorschlagen )

    deaktivieren.

    Das sollte es eigentlich gewesen sein.

    Hoagi

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...