2014-02-17 51 views
1

失敗,但sccessful這是爲什麼沒有通過GCC編譯器,但全成由VC6.0函數返回結構編譯通過GCC由VC6.0

gcc版本4.1.2 20070115(的SUSE Linux)

linux:~# cc t.c 
t.c: In function ‘main’: 

t.c:24: error: invalid use of non-lvalue array - printf((confFQDNtolower(&tFQDN)).strName); 

代碼:

#include <stdio.h> 
#include <ctype.h> 

typedef struct { 
    char strName[128]; 
    unsigned short wLen; 
}T_FQDN; 

T_FQDN confFQDNtolower(T_FQDN *ptFQDN) 
{ 
    static T_FQDN tFQDN = {0}; 
    int i; 

    tFQDN.wLen = ptFQDN->wLen; 
    for (i = 0; i < ptFQDN->wLen; i++) 
    { 
     tFQDN.strName[i] = tolower(ptFQDN->strName[i]); 
    } 

    return tFQDN; 
} 

int main() 
{ 
    T_FQDN tFQDN = {"a.B.c", 5}; 

    printf((confFQDNtolower(&tFQDN)).strName); 

    return 0; 
} 
+0

這不是C++。它是C. – Davidbrcz

+0

適用於GCC 4.8.2。你使用什麼版本? – Drop

+1

爲什麼你會設計一個這樣的函數來接受一個非''const'指針並返回一個值?您是否積極*嘗試*設計可能最不直觀的界面,在這裏?好的工作,在這種情況下。 :) – unwind

回答

-3

我認爲應該按以下方式更改代碼。

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

typedef struct { 
    char *strName; 
    unsigned short wLen; 
}T_FQDN; 

T_FQDN confFQDNtolower(T_FQDN *ptFQDN) 
{ 
    static T_FQDN tFQDN = {NULL,0}; 
    int i; 

    tFQDN.wLen = ptFQDN->wLen; 

    if(!tFQDN.strName) free(tFQDN.strName); 
    tFQDN.strName = strdup(ptFQDN->strName); 


    for (i = 0; i < ptFQDN->wLen; i++) 
    { 
     tFQDN.strName[i] = tolower(tFQDN.strName[i]); 
    } 


    return tFQDN; 
} 
+0

OP爲什麼要這樣做? – alk

+0

我想不出一個很好的理由,爲什麼這是一個好主意。 – Roddy

0

您需要更改的唯一的事情就是printf()的行:

printf("%s", (confFQDNtolower(&tFQDN)).strName); 

上述工作都與海灣合作委員會和VisualStudio中的CL編譯器。

+0

如果OP的版本確實有效,那麼你的OP也不會。 – alk