2015-12-15 2 views
-1

Я пишу программу, которая вычисляет наибольший общий знаменатель двух чисел, но у меня возникают проблемы с функцией malloc. На самом деле ясно, как сегменты стека и кучи работают в памяти и почему. Но все же я еще не способен понять, когда объявление указателя и использование malloc является функциональным или нет, необходимо или нет, в программе. вот код:Неверное преобразование из * void в * int [-fpermissive] с помощью malloc (sizeof())

#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 

int *calcolaDivisori(int); 

int main(int argc, char** argv) { 

    int foundCounter = 0; 
    int i,j,s1,s2; 
    int n1,n2; 
    int mcd = 1,mcm; 
    int *pn1,*pn2; 
    int d1[100],d2[100]; 

    // INPUT dei due interi 

    printf("Inserisci il primo numero :"); 
    scanf(" %d", &n1); 
    printf("\nInserisci il secondo numero :"); 
    scanf(" %d", &n2); 

    // calcolo divisori del primo e del secondo numero e li assegno ai relativi array 

    pn1 = calcolaDivisori(n1); 
    if (!pn1) return 1; 
    pn2 = calcolaDivisori(n2); 
    if (!pn2) return 1; 

    for (i=0;i<n1;i++) { 
     d1[i] = pn1[i]; 
    } 

    for (i=0;i<n2;i++) { 
     d2[i] = pn2[i]; 
    } 

    free(pn1); 
    free(pn2); 

    // confronto i divisori e calcolo il MCD 

    s1 = sizeof(d1)/sizeof(int); 
    s2 = sizeof(d2)/sizeof(int); 

    for(i=0; i<s1; i++) { 
     for (j=foundCounter; j<s2;j++) { 
      if (d1[i] == d2[j]) { 
       mcd*= d1[1]; 
       foundCounter = j+1; 
       break; 
      } 
     } 
    } 

    printf("\n\nIl minimo comune divisore e' : %d", mcd); 

    return 0; 
} 

int *calcolaDivisori(int num) { 
    int i; 
    int *a = malloc(num * sizeof(int)); 
    if (!a) return NULL; 
    for (i=2;i<num;i++) { 
     if (num%i == 0) { 
      num/=i; 
      a[i-2]=i; 
     } 
    } 

    return a; 
} 

Я получаю ошибку в названии при выполнении команды:

int *a = malloc(sizeof(int)); 
+7

Вы должны получить это предупреждение только в том случае, если вы компилируете свой код как C++. Компилятор C не даст этого предупреждения. – kaylum

+4

@kaylum - '#include ' Еще одна распродажа, которую я бы сказал. – Persixty

+1

@ DanAllen Да, вы правы. Я пропустил это и увидел только тег 'C'. @Ghislo, пожалуйста, исправьте свои теги, поскольку кажется, что вы пишете код на C++, а не код C (если это действительно ваше намерение). – kaylum

ответ

3

Вам нужно бросить:

int *a = (int*)malloc(num * sizeof(int)); 

Поскольку нет неявного преобразования из void* - type * в C++.

Обратите внимание, что этот бросок не требуется в C и потенциально может быть dangerous сделать это в C.

за исключением #include <iostream>, ничто в вашем коде не C++. Поэтому удалите его и скомпилируйте с помощью компилятора C, и вам не понадобится этот приведение.

+0

Поскольку это C++, может также использоваться 'static_cast <>', что затрудняет ошибку для C и напоминает программисту об удалении приведения, если код скопирован в фактический источник C. Или еще лучше, удалите malloc вообще на C++, вместо этого используйте 'std :: vector'. – Medinoc

+0

@Medinoc Да, я согласен с вашим предложением. Но я не уверен, действительно ли это C++. Я думал о редактировании тега на C++. Но это действительно кажется кодом C, за исключением включения '' (и, следовательно, OP компилирует его как C++). –

+0

Вы не должны использовать malloc в программах на C++, поэтому вам не нужно обдумывать актерский состав в первую очередь. Смешивание malloc/free, в то время как все остальное в C++ использует несовместимое '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' – Lundin

Смежные вопросы