Operator trójargumentowy i różne typy operandów

0

Podczas kompilacji dostaję warninga o niezgodności typów: warning: pointer/integer type mismatch in conditional expression
Problem dotyczy operatora trójargumentowego, których operandy są różnego typu w moim przypadku odpowiednio:
const char*?int:char

np:

const char* tmp = NULL;
char buffer[32] = {0};
const char* defaultValue = "anydir/";
...

tmp == NULL?sprintf("buffer, "%s/%s", "path", defaultValue):strcpy(buffer, tmp); 

Z uwagi na to, że to tylko "warning" program się kompiluje, ale czy jestem skazany na tego warninga, czy istnieje jakiś trick omijający ten problem w kontekście takiego zastosowania operatora trójargumentowego ?

2

if else
Już warning sugeruje, że to jest kiepskie miejsce na zastosowanie tego operatora.

1

operator ?: wymaga aby poszczególne jego składowe były konwertowalne do wspólnego typu (w szczególności mogą być tego samego typu). W swoim kodzie używasz tego operatora, gdy jedna składowa zwraca int, a druga char* (z implicit konwersją). Tak jak napisał @twonek lepiej użyć if else.

0

Tak wiem, pierwszy argument jest typu const char* ale on nie ma akurat znaczenia, tak więc jedyne rozwiązanie jakie tutaj widzę aby pozbyć się warningów to zastosowanie funkcji, które zwracają "kompatybilne" typy, np:

tmp == NULL?sprintf(buffer, "%s/%s", "path", defaultValue):sprintf(buffer, "%s", tmp); 

Teraz jest OK.
Oczywiście najprościej if/else ale akurat nie o prostotę, tutaj chodzi ;)

4

Oczywiście. Gdzie problem (jeśli dobrze zrozumiałem)?

tmp == NULL ? (void) sprintf("buffer", "%s/%s", "path", defaultValue) : (void) strcpy(buffer, tmp);
#include <stdio.h>
#include <stdbool.h>

void tak_nie_rob(unsigned val) {
    (void) (((val % 2) && (
                    printf("To że można, "), true
                )
                ) || (
                     printf("nie oznacza że tak należy.\n"), true
                )
        );
}

int main(void) {
    tak_nie_rob(3);
    tak_nie_rob(2);
}
0

Widać, że łączysz ścieżkę do jakiś danych, ale jak dla mnie wygląda to na zupełne przekombinowanie problemu.
Podaj pełen kod, a ktoś ci pokaże jak to powinno wyglądać, a najlepiej opisz co to powinno robić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1