fallowy Temat założony przez niniejszego użytkownika |
Mnożenie macierzy z plików wcześniej utworzonych. » 2017-05-31 19:39:14 Witam. Borykam się z tym problemem od tygodnia i w końcu postanowiłem poszukać pomocy na forum po przejrzeniu dużej ilości stron w sieci. Żeby wszystko było klarowne: programik działał, z tym, że na komputerze na którym go robiłem (wyposażony w VS2017). Po skopiowaniu programu na pulpit zdalny na zaliczenie ni stąd ni zowąd wywaliło mi błąd wskaźnika. Dostępu do tego komputera na którym robiłem program niestety nie mam (był to laptopik, który wróci dopiero za 2 tygodnie, a wtedy to będzie po ptakach). Na VS2012 szkolnym program wywala błąd, jak i na mojej stacjonarce z VS2015. Próbowałem odpalić go także u kolegi z VS2017, ale niestety to samo. Dobra, po opisaniu mniej więcej treści problemu przejdę do treści zadania, a na samym końcu posta zamieszczę kodzik. Treść zadania: "Stwórz program, który przyjmuje dwa argumenty (są to nazwy plików tekstowych). W tych plikach zapisane są wcześniej stworzone macierze (w sensie losowe cyferki wpisane przed kompilacją). Program czyta macierz z pliku A.txt i B.txt, mnoży je i zapisuje do pliku C.txt (którego ma wcześniej stworzyć). Format zapisu txt: 2 3 -> ilość wierszy, kolumn 1 7 5 8 2 3 Pierwsza sekcja programu: przygotowanie tablic do mnożenia Druga sekcja programu: mnożenie a*b=c Trzecia sekcja programu: umieszczenie macierzy c do pliku C.txt" Dodam jeszcze, że operuje na języku C w Visual Studio, więc programik jest stworzony w języku C, a nie C++. Kod zamieszczam poniżej. Pozdrawiam i dziękuje za przeczytanie :) PS. Zapomniałem opisać dokładny problem, żeby zachować merytoryke. Kod problemu: "DEBUG ASSERTION FAILED! [ścieżka programu/linia kodu(nieistotna)] Expression: file_name != nullptr" #include "stdafx.h" #include <stdlib.h>
int ** Create( int a, int b ) { int ** tab; int i, j; tab =( int ** ) malloc( sizeof( int * ) * a ); for( i = 0; i < a; i++ ) { tab[ i ] =( int * ) malloc( sizeof( int ) * b ); } return tab; }
void Relase( int ** A, int a ) { for( int i = 0; i < a; i++ ) { free( A[ i ] ); } free( A ); }
int main( int argc, char * argv[] ) { int ** A, ** B, ** C, a, b, c, d; FILE * x; x = fopen( argv[ 1 ], "r" ); fscanf( x, "%d%d", & a, & b ); A = Create( a, b ); for( int i = 0; i < a; i++ ) { for( int j = 0; j < b; j++ ) { fscanf( x, "%d", & A[ i ][ j ] ); } } FILE * y; y = fopen( argv[ 2 ], "r" ); fscanf( y, "%d%d", & c, & d ); B = Create( c, d ); for( int i = 0; i < c; i++ ) { for( int j = 0; j < d; j++ ) { fscanf( y, "%d", & B[ i ][ j ] ); } } C = Create( a, d ); for( int i = 0; i < a; i++ ) { for( int j = 0; j < d; j++ ) { int s = 0; for( int k = 0; k < b; k++ ) { s = s + A[ i ][ k ] * B[ k ][ j ]; } C[ i ][ j ] = s; } } FILE * z; z = fopen( "C.txt", "w" ); for( int i = 0; i < a; i++ ) { for( int j = 0; j < d; j++ ) fprintf( z, "%d", C[ i ][ j ] ); fprintf( z, "\n" ); } fclose( x ); fclose( y ); fclose( z ); Relase( A, a ); Relase( B, c ); Relase( C, a ); system( "PAUSE" ); return 0; }[ / i ] |
|
pekfos |
» 2017-05-31 19:59:26 A gdzie test, czy podano do programu wymagane argumenty? DEBUG ASSERTION FAILED! [ścieżka programu/linia kodu(nieistotna)] Expression: file_name != nullptr |
Skoro wiesz, co jest istotne, czemu sam nie rozwiązałeś problemu..? |
|
fallowy Temat założony przez niniejszego użytkownika |
» 2017-05-31 20:11:57 Test nie jest istotny, istotne jest działanie programu, a tu nie leży problem.
Sęk w tym, że nie mam pojęcia jak go rozwiązać. Próbowałem na multum sposobów i nie mam pojęcia czym jest on spowodowany :/ |
|
pekfos |
» 2017-05-31 20:15:50 Skoro wiesz, co jest istotne, czemu sam nie rozwiązałeś problemu..? Test jest zawsze istotny, gdy używa się czegoś, co nie musi istnieć - jak argumenty programu. Pierwszy argument poza zakresem ma gwarantowane zero, więc program wysypuje się na asercji w fopen(), zamiast wchodzić w śmieci i robić nie wiadomo co. Program czyta macierz z pliku A.txt i B.txt, mnoży je i zapisuje do pliku C.txt |
Nawet masz podane w poleceniu, jakie są nazwy plików, więc czemu nie masz tego w kodzie? |
|
fallowy Temat założony przez niniejszego użytkownika |
» 2017-05-31 20:18:19 Ehhh, pewnie masz rację, niepotrzebnie szedłem w zaparte.
Moje umiejętności programistyczne nie są jeszcze najlepsze, więc jak już spojrzałeś w mój kodzik to mógłbyś mi powiedzieć jak wykonać to sprawdzenie? :( |
|
pekfos |
» 2017-05-31 20:23:21 argc zawiera ilość argumentów programu. Jednak jak to poprawisz, program pewnie dalej nie będzie działał poprawnie, bo problem wziął się z tego, że program został uruchomiony bez argumentów. Więc może powinieneś użyć nazw plików danych w zadaniu, zamiast wczytywać je z argumentów..? |
|
fallowy Temat założony przez niniejszego użytkownika |
» 2017-05-31 20:32:29 A wiesz, że próbowałem to zrobić? :D
Zamiast argv[1,2] wpisałem odpowiednio nazwy plików. Wtedy też program się skompilował bez błędu, wyskoczyło czarne okno (tak jakby program działał, ale nawet po zamknięciu okna VS go trzymał "on hold"), ale podczas odpalania .exe wywala błąd, tak samo z cmd :/ |
|
pekfos |
» 2017-05-31 20:43:59 Jest wtedy ten sam błąd? Masz pliki o tych nazwach? Najlepiej dodaj test, czy plik się udało otworzyć. fopen() zwraca zero, jak coś się nie uda i nie możesz tej wartości użyć do operacji plikowych. |
|
« 1 » 2 |