dizem Geschrieben 11. Januar 2010 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
e@sy Geschrieben 11. Januar 2010 Geschrieben 11. Januar 2010 Und warum schreibst du das dann nicht in das Forum C++ anstadt in "Fragen und Anregungen zum Board" ?
Klotzkopp Geschrieben 11. Januar 2010 Geschrieben 11. Januar 2010 Kann mir jemand dabei einen Tipp geben? w ist ein double*. int* passt da nicht drauf.
dizem Geschrieben 11. Januar 2010 Autor 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?
Klotzkopp Geschrieben 11. Januar 2010 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.
dizem Geschrieben 11. Januar 2010 Autor 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?
TDM Geschrieben 12. Januar 2010 Geschrieben 12. Januar 2010 ich müsste nun ein Programm in C++ [...] kein malloc, new. (Wenn überhaupt Zeiger)
Klotzkopp Geschrieben 12. Januar 2010 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.
TDM Geschrieben 12. Januar 2010 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.
dizem Geschrieben 12. Januar 2010 Autor 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....
dizem Geschrieben 12. Januar 2010 Autor 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
Klotzkopp Geschrieben 12. Januar 2010 Geschrieben 12. Januar 2010 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup".Dein Programm hat keine main-Funktion.
dizem Geschrieben 12. Januar 2010 Autor 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
Klotzkopp Geschrieben 12. Januar 2010 Geschrieben 12. Januar 2010 Wie ich schon sagte: Dein Programm hat keine main-Funktion.
dizem Geschrieben 12. Januar 2010 Autor Geschrieben 12. Januar 2010 danke sehr an euch alle...werde daran erstmal arbeiten..
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden