Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

const, a define

Ostatnio zmodyfikowano 2016-11-02 07:29
Autor Wiadomość
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 :

C/C++
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <ctime>
#define ILWIERSZY 2
#define ILKOLUMN 3



/* Mnozenie macierzy A * B = C */
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; // liczniki
    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 ]; // macierz wyników
    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.
P-153050
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:

C/C++
#define VALUE 5
int foo( int a );

//...

foo( VALUE );
C/C++
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ść.
P-153085
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>
?
P-153086
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...
P-153185
michal11
» 2016-11-01 17:41:50
Prawdopodobnie brakuje
std::
 przed każdą z tych funkcji.
P-153187
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.
P-153243
« 1 »
  Strona 1 z 1