Sidu Temat założony przez niniejszego użytkownika |
const, a define » 2016-10-30 12:08:35 Witam, przeczytałem własnie rozdział w Symfonii C++ dotyczący const i define. Według autora const ma przewage nad define, bo można zapytać o te wartość i program będzie w stanie na to odpowiedzieć. Co jeśli mam taki przypadek : #include <stdio.h> #include <cstdlib> #include <iostream> #include <ctime> #define ILWIERSZY 2 #define ILKOLUMN 3
int mnozeniemac( double A[ ILWIERSZY ][ ILKOLUMN ], double D[ ILKOLUMN ][ ILWIERSZY ], double C[ ILWIERSZY ][ ILKOLUMN ] ) { int i, j, k; for( i = 0; i < ILWIERSZY; i++ ) for( j = 0; j < ILKOLUMN; j++ ) C[ i ][ j ] = 0; for( i = 0; i < ILWIERSZY; i++ ) for( j = 0; j < ILWIERSZY; j++ ) for( k = 0; k < ILKOLUMN; k++ ) C[ i ][ j ] = C[ i ][ j ] + A[ i ][ k ] * D[ k ][ j ]; return 0; }
int main() { int i, j; srand( time( NULL ) ); double A[ 2 ][ 3 ]; double B[ 2 ][ 3 ] = { { rand() % 11, rand() % 11, rand() % 11 }, { rand() % 11, rand() % 11, rand() % 11 } }; double C[ 2 ][ 3 ]; double D[ 3 ][ 2 ] = { { rand() % 11, rand() % 11 }, { rand() % 11, rand() % 11 }, { rand() % 11, rand() % 11 } }; printf( "Macierz A\n" ); for( i = 0; i < ILWIERSZY; i++ ) { for( j = 0; j < ILKOLUMN; j++ ) printf( "%g ", A[ i ][ j ] ); puts( "" ); } puts( "" ); printf( "Macierz D\n" ); for( i = 0; i < ILKOLUMN; i++ ) { for( j = 0; j < ILWIERSZY; j++ ) printf( "%g ", D[ i ][ j ] ); puts( "" ); } puts( "" ); mnozeniemac( A, D, C ); printf( "Iloczyn macierzy A * D\n" ); for( i = 0; i < ILWIERSZY; i++ ) { for( j = 0; j < ILWIERSZY; j++ ) printf( "%g ", C[ i ][ j ] ); puts( "" ); } return 0; } tutaj dzieki define ustalam wartość dla całego programu. Nie jestem w stanie użyć const jeśli nie będzie w bloku. |
|
kmlkamilek |
» 2016-10-30 23:04:38 Zacznijmy od najważniejszego. Const deklaruje stałą, która jest zapisywana w pamięci, a define to makro. Czym to się różni? Może lepiej zacznę od początku. Jednymi z etapów kompilacji programów w C/C++ są prekompilacja i kompilacja właściwa. Podczas prekompilacji przetwarzane są dyrektywy preprocesora (wszystkie instrukcje zaczynające się od znaku hasztaga #), czyli include, lub define i kilka innych. Wszystkie dyrektywy include zostają zastąpione zawartością pliku nagłówkowego jaki tą dyrektywą aktualnie załączamy, a define wyrażeniami jakie do danego makra podstawiliśmy. Po prekompilacji następuje kompilacja właściwa, czyli kod c++ po przetworzeniu dyrektyw jest przetwarzany na kod assemblera. A więc jak to ma się to pytania? Z perspektywy kompilacji właściwej te dwa fragmenty kodu będą identyczne: #define VALUE 5 int foo( int a );
foo( VALUE );
int foo( int a );
foo( 5 );
Podczas prekompilacji makro VALUE zostanie zastąpione wyrażeniem jakie reprezentuje. W obu przypadkach przekażemy do funkcji r-wartość. |
|
karambaHZP |
» 2016-10-30 23:13:51 Piszesz w C++. Jeśli nie masz wyraźnej potrzeby używać #define korzystaj z constexpr . edit: w sumie to nie piszesz, więc po co to #include <iostream> ? |
|
Sidu Temat założony przez niniejszego użytkownika |
» 2016-11-01 17:36:00 dziękuje za wyjaśnienie. Jeszcze mam pytanie. W dev-c++ ten program mi sie normalnie odpalał. W VS już nie chce, bo mówi, że rand, srand i time jest nie znane, czy coś takiego... |
|
michal11 |
» 2016-11-01 17:41:50 Prawdopodobnie brakuje std:: przed każdą z tych funkcji. |
|
kmlkamilek |
» 2016-11-02 07:29:17 Są dwa sposoby załączania bibliotek z języka C. 1. Nazwa z rozszerzeniem #include <stdio.h> 2. Nazwa, lecz zamiast rozszerzenia pliku, na początku nazwy wstawiamy literę 'c' #include <cstdio> Załączając drugim sposobem funkcje języka C są umieszczane w przestrzeni nazw std. Najlepszą opcją było by udostępnienie treści komunikatów. Łatwiej będzie sprawdzić, czy to wina VS. |
|
« 1 » |