2014-09-02 57 views
-1

我想做一個排序函數來排序浮點值不兼容指針的順序。當你運行代碼時,在輸入指針數組的大小並輸入值之後,運行剛剛停止。我不知道問題出在哪裏,任何人都可以提供幫助。 我已經糾正了警告,但現在仍然導致運行該代碼排序功能不工作,模擬不能繼續

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

void sort(const int size, float *input, float *output); 


int main(void) { 
    int a; 

    float *b=&b1; 

    float *c=&c1; 
    int i, i1; 

    printf("input the size\n"); 
    scanf("%d", &a); 
    b=(float*)malloc(sizeof(int)*a); 
    c=(float*)malloc(sizeof(int)*a); 
    for(i=0; i<a ; i++){ 
     scanf("%f", &b[i]); 

    } 
    for(i1=0; i1<a; i1++){ 
     c[i1]=b[i1]; 
     printf("%f\n", c[i1]); 
    } 

    sort(10, b, c); 
    free(b); 
    free(c); 
    return 0; 
} 

void sort(const int size, float *input, float *output) 
{ 
    void swap(float *element1Ptr, float *element2Ptr); 
    int pass; 
    int j; 
    int i0; 

    for (pass=0; pass<size-1;pass++) 
    { 
     for (j=0; j<size-1;j++){ 
      if(input[j]>input[j+1]){ 

      swap(&input[j], &input[j+1]); 
      } 

     } 
    } 


    for (i0=0; i0<size; i0++){ 
     output[i0]=input[i0]; 
     printf("%f", output[i0]); 
    } 

} 

void swap(float *element1Ptr, float *element2Ptr) 
{ 
float hold=*element1Ptr; 
*element1Ptr=*element2Ptr; 
*element2Ptr=hold; 
} 
+2

先修復您的警告。 – wRAR 2014-09-02 10:00:29

+0

你爲什麼要爲'float *'分配'int *'? – 2014-09-02 10:01:33

+1

[請不要在C]中輸入'malloc()'的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – unwind 2014-09-02 10:02:46

回答

0

您定義的變量b具有類型float *

float *b=&b1; 

但嘗試指派指針爲int該變量

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

首先,有在B

的初始化沒有意義
float *b=&b1; 

其次似乎你想分配一個數組彩車。所以你必須寫

b = (float *)malloc(sizeof(float) * a); 

你也沒有分配內存指向c。所以這個代碼

for(i1=0; i1<a; i1++){ 
    c[i1]=b[i1]; 
    printf("%f\n", c[i1]); 
} 

sort(10, b, c); 

是無效的,程序有未定義的行爲。目前還不清楚爲什麼你在排序中使用幻數10而不是變量a。

定義變量b1和c1有什麼意義?

float b1=0; 
float c1=0; 

看來他們沒有使用。

1

修復1:首先你要分配兩條浮法地址指針cd -

float *b=&b1; 

float *c=&c1; 

那你就爲它分配內存。它根本沒有意義。當您分配內存時,新分配的內存地址將返回到指針bc

如果您想讓0分配給所有分配的內存,您可以使用calloc來分配內存。因爲它將分配內存和在它清除數據,並給它用戶

float *b= (float *)calloc(a,sizeof(float)); 

float *c= (float *)calloc(a,sizeof(float)); 

修復2:你具有浮動指針。但分配內存後你的類型轉換內存int * -

float *b=&b1; 

b=(int*)malloc(sizeof(int)*a); // don't do this 

而是使用 -

b=malloc(sizeof(float)*a); 

修復3:採用了內存分配爲float *c你給它賦值 -

for(i1=0; i1<a; i1++){ 
    c[i1]=b[i1]; // note here. you have not allocated memory for c before 
    printf("%f\n", c[i1]); 
} 

爲內存分配float *c並執行此操作。

c = malloc(sizeof(float)*a); 

一個簡單的程序來完成你的工作 -

#include <stdio.h> 
#include <stdlib.h> 
void sort(const int size, float *input); 

int main(void) { 
     int a,i; 
     float *b; 

     printf("input the size\n"); 
     scanf("%d", &a); 
     b=(float*)malloc(sizeof(float)*a); 
     for(i=0; i<a ; i++){ 
       scanf("%f", &b[i]); 
     } 

     sort(a, b); 

     for (i=0; i<a; i++) 
       printf("%f\n",b[i]); 

     free(b); 
     return 0; 
} 

void sort(const int size, float *input) 
{ 
     int pass,j,temp; 
     for (pass=0; pass<size-1;pass++) 
     { 
       for (j=0; j<size-1;j++){ 
         if(input[j]>input[j+1]){ 
           temp = input[j]; 
           input[j]=input[j+1]; 
           input[j+1]=temp; 
         } 
       } 
     } 
} 

不要使用不必要的變量,其他那麼重要的!如果你想要一個你的輸入的副本,將它複製到另一個數組,並在輸出數組上進行排序,而不是在輸入數組上進行排序!

1

您的代碼中存在一些錯誤。

沒有內存分配給c。您在sort中修改了輸入數組。

打印一張環環分至10

另外,我清理了格式化一下。

我移動前向聲明,以便它在排序函數之外。不是一個錯誤,但程序員期望前置聲明放在任何函數之外。

我刪除了不必要的printf語句並只打印排序的數組。

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

void sort(const int size, const float *input, float *output); 
void swap(float *element1Ptr, float *element2Ptr); 


int main(void) { 
    int a; 
    float *b; 
    float *c; 
    int i, i1; 

    printf("input the size\n"); 
    scanf("%d", &a); 
    b = malloc(sizeof(float)*a); 
    c = malloc(sizeof(float)*a); 

    for(i=0; i<a ; i++){ 
     scanf("%f", &b[i]); 
    } 
    sort(a, b, c); 

    for(i1=0; i1<a; i1++){ 
     printf("%f\n", c[i1]); 
    } 

    free(b); 
    free(c); 
    return 0; 
} 

void sort(const int size, float const *input, float *output) 
{ 
    int pass; 
    int j; 
    int i0; 

    for (i0=0; i0<size; i0++){ 
     output[i0]=input[i0]; 
    } 

    for (pass=0; pass<size-1;pass++) 
    { 
     for (j=0; j<size-1;j++){ 
      if(output[j]>output[j+1]){ 
       swap(&output[j], &output[j+1]); 
      } 
     } 
    } 
} 

void swap(float *element1Ptr, float *element2Ptr) 
{ 
    float hold=*element1Ptr; 
    *element1Ptr=*element2Ptr; 
    *element2Ptr=hold; 
} 

一般建議:

調高編譯器的警告級別。編譯器警告是有原因的。