dizem Geschrieben 11. Januar 2010 Teilen Geschrieben 11. Januar 2010 Hallo Ich bin ziemlich die Abfängerin bei C++ und habe folgenden Code aufgeschrieben : /* sparse Cholesky update/downdate, L*L' + sigma*w*w' (sigma = +1 or -1) */ int cs_updown (cs *L, int sigma, const cs *C, const int *parent) { int p, f, j, *Lp, *Li, *Cp, *Ci ; double *Lx, *Cx, alpha, beta = 1, delta, gamma, w1, w2, *w, n, beta2 = 1 ; if (!L || !C || !parent) return (0) ; Lp = L->p ; Li = L->i ; Lx = L->x ; n = L->n ; Cp = C->p ; Ci = C->i ; Cx = C->x ; if ((p = Cp [0]) >= Cp [1]) return (1) ; /* return if C empty */ w = (int*)cs_malloc (n, sizeof (int)) ; if (!w) return (0) ; f = Ci [p] ; for ( ; p < Cp [1] ; p++) f = CS_MIN (f, Ci [p]) ; /* f = min (find ©) */ for (j = f ; j != -1 ; j = parent [j]) w [j] = 0 ; /* clear workspace w */ for (p = Cp [0] ; p < Cp [1] ; p++) w [Ci [p]] = Cx [p] ; /* w = C */ for (j = f ; j != -1 ; j = parent [j]) /* walk path f up to root */ { p = Lp [j] ; alpha = w [j] / Lx [p] ; /* alpha = w(j) / L(j,j) */ beta2 = beta*beta + sigma*alpha*alpha ; if (beta2 <= 0) break ; /* not positive definite */ beta2 = sqrt (beta2) ; delta = (sigma > 0) ? (beta / beta2) : (beta2 / beta) ; gamma = sigma * alpha / (beta2 * beta) ; Lx [p] = delta * Lx [p] + ((sigma > 0) ? (gamma * w [j]) : 0) ; beta = beta2 ; for (p++ ; p < Lp [j+1] ; p++) { w1 = w [Li [p]] ; w [Li [p]] = w2 = w1 - alpha * Lx [p] ; Lx [p] = delta * Lx [p] + gamma * ((sigma > 0) ? w1 : w2) ; } } cs_free (w) ; return (beta2 > 0) ; } wobei die Zeile mit w = (int*)cs_malloc (n, sizeof (int)) , den Fehler C2440 verursacht Kann mir jemand dabei einen Tipp geben? LG Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
e@sy Geschrieben 11. Januar 2010 Teilen Geschrieben 11. Januar 2010 Und warum schreibst du das dann nicht in das Forum C++ anstadt in "Fragen und Anregungen zum Board" ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 11. Januar 2010 Teilen Geschrieben 11. Januar 2010 Kann mir jemand dabei einen Tipp geben? w ist ein double*. int* passt da nicht drauf. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dizem Geschrieben 11. Januar 2010 Autor Teilen Geschrieben 11. Januar 2010 da ich neu in Forum bin weiß nicht ganz genau wo ich Beiträge posten soll..Du meinst dass ich w = (double*)cs_malloc (n, sizeof (double)) schreiben soll? Dies habe ich schon ausprobiert , der zeigt dann mehrere Fehlern Wie könnte es sonst lösen?Hat jemand sonst eine Idee? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 11. Januar 2010 Teilen Geschrieben 11. Januar 2010 Du meinst dass ich w = (double*)cs_malloc (n, sizeof (double)) schreiben soll?Ich kann dir nicht sagen, was du schreiben sollst, weil ich nicht weiß, was der Code tun soll. Der Code ist offensichtlich nicht von dir, sondern stammt aus der CSparse-Bibliothek, mit leichten Änderungen. Niemand hier weiß aber, ob die Änderungen am Code Absicht sind, und welches Ziel sie haben. Dies habe ich schon ausprobiert , der zeigt dann mehrere FehlernUnd welche das sind, sollen wir jetzt raten? Warum denn überhaupt der Cast? cs_malloc gibt void* zurück, das sollte sich ohne Cast umwandeln lassen. Oder schickst du den Code durch einen C++-Compiler? Wie könnte es sonst lösen?Hat jemand sonst eine Idee?Was lösen? Was ist denn überhaupt das Problem? Geht es dir nur darum, dass der Code fehlerfrei compiliert werden kann? Ist dir klar, dass er dann ziemlich sicher trotzdem nicht das tust, was du willst? Der Compiler meldet nur Fehler, wenn er den Code nicht übersetzen kann. Er kann nicht prüfen, ob der Code das tut, was du willst. Und was du willst, hast du uns noch nicht gesagt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dizem Geschrieben 11. Januar 2010 Autor Teilen Geschrieben 11. Januar 2010 du hast Recht der Code ist nicht von mir, mir gehts nur darum dass der fehlerfrei funktioniert , ich muss nur die Ausgabe davon haben , das eigentliche Problem ist: ich müsste nun ein Programm in C++ schreiben der einen Matrix permutiert wie in matlab der dmperm macht..Deswegen habe ich die csparse.cpp und csparse.h mit dem code cs_permute Dateien versucht zusammen zu verknüpfen... Es entstehen natürlich Fehler die ich nicht beheben könnte.Hast du vielleicht eine bessere Idee wie ich weiterkommen kann? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 12. Januar 2010 Teilen Geschrieben 12. Januar 2010 ich müsste nun ein Programm in C++ [...] kein malloc, new. (Wenn überhaupt Zeiger) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 12. Januar 2010 Teilen Geschrieben 12. Januar 2010 kein malloc, new.malloc gibt's auch in C++. Es gibt nur wenige Dinge, die in C erlaubt, in C++ aber nicht erlaubt sind. Die implizite Konvertierung von void-Zeigern ist eins dieser Dinge. dizem, du hast immer noch nicht gesagt, welche Fehler gemeldet werden, wenn du den Cast in (double*) änderst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 12. Januar 2010 Teilen Geschrieben 12. Januar 2010 Es gibt nur wenige Dinge, die in C erlaubt, in C++ aber nicht erlaubt sind. Die implizite Konvertierung von void-Zeigern ist eins dieser Dinge. Eben deswegen. Mein Unterbewusstsein verbietet mir den Rückgabewert von malloc zu casten. :floet: (C oder C++, spielt dabei keine Rolle) Nuja, Geschmackssache. new muss man wenigstens nicht casten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dizem Geschrieben 12. Januar 2010 Autor Teilen Geschrieben 12. Januar 2010 die fehlermeldung sagt dass error C2440: '=': 'int *' kann nicht in 'double *' konvertiert werden kann..Ich komme nicht weiter...das ist der einzige Fehler ...wenn ich in int* schreibe dann meckert der zicht mal.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dizem Geschrieben 12. Januar 2010 Autor Teilen Geschrieben 12. Januar 2010 (bearbeitet) mit dem code w = (double*)cs_malloc(n, sizeof (double)) ; if (!w) return (0) ; Zeigt er folgende Fehler. :\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\permute\permute\csparse.cpp(1922) : warning C4244: 'Argument': Konvertierung von 'double' in 'int', möglicher Datenverlust Manifest in Ressourcen wird kompiliert... Microsoft ® Windows ® Resource Compiler Version 6.1.6723.1 Copyright © Microsoft Corporation. All rights reserved. Verknüpfen... MSVCRTD.lib(crtexe.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup". C:\Dokumente und Einstellungen\Admin\Eigene Dateien\Visual Studio 2008\Projects\permute\Debug\permute.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise. Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Admin\Eigene Dateien\Visual Studio 2008\Projects\permute\permute\Debug\BuildLog.htm" gespeichert. permute - 2 Fehler, 1 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ========== Bearbeitet 12. Januar 2010 von dizem Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 12. Januar 2010 Teilen Geschrieben 12. Januar 2010 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup".Dein Programm hat keine main-Funktion. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dizem Geschrieben 12. Januar 2010 Autor Teilen Geschrieben 12. Januar 2010 int p, f, j, *Lp, *Li, *Cp, *Ci ; double *Lx, *Cx, alpha, beta = 1, delta, gamma, w1, w2, *w, n, beta2 = 1 ; if (!L || !C || !parent) return (0) ; Lp = L->p ; Li = L->i ; Lx = L->x ; n = L->n ; Cp = C->p ; Ci = C->i ; Cx = C->x ; if ((p = Cp [0]) >= Cp [1]) return (1) ; /* return if C empty */ w = (double*)cs_malloc(n, sizeof (double)) ; if (!w) return (0) ; f = Ci [p] ; for ( ; p < Cp [1] ; p++) f = CS_MIN (f, Ci [p]) ; /* f = min (find ©) */ for (j = f ; j != -1 ; j = parent [j]) w [j] = 0 ; /* clear workspace w */ for (p = Cp [0] ; p < Cp [1] ; p++) w [Ci [p]] = Cx [p] ; /* w = C */ for (j = f ; j != -1 ; j = parent [j]) /* walk path f up to root */ { p = Lp [j] ; alpha = w [j] / Lx [p] ; /* alpha = w(j) / L(j,j) */ beta2 = beta*beta + sigma*alpha*alpha ; if (beta2 <= 0) break ; /* not positive definite */ beta2 = sqrt (beta2) ; delta = (sigma > 0) ? (beta / beta2) : (beta2 / beta) ; gamma = sigma * alpha / (beta2 * beta) ; Lx [p] = delta * Lx [p] + ((sigma > 0) ? (gamma * w [j]) : 0) ; beta = beta2 ; for (p++ ; p < Lp [j+1] ; p++) { w1 = w [Li [p]] ; w [Li [p]] = w2 = w1 - alpha * Lx [p] ; Lx [p] = delta * Lx [p] + gamma * ((sigma > 0) ? w1 : w2) ; } } cs_free (w) ; return (beta2 > 0) ; } JETZT habe ich nun einen Fehler mit dem Linker und zwar.. error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup" wieß nicht wie ich den beheben soll?Ich bin ziemlich die Anfängerin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 12. Januar 2010 Teilen Geschrieben 12. Januar 2010 Wie ich schon sagte: Dein Programm hat keine main-Funktion. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dizem Geschrieben 12. Januar 2010 Autor Teilen Geschrieben 12. Januar 2010 danke sehr an euch alle...werde daran erstmal arbeiten.. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.