C program we/wy nie działa

Niedawno zacząłem uczyć się C, jednak piszę mały przykładowy/praktyczny kawałek kodu i zdarza się, że pokazują błędy. Używam deskryptora pliku, a niektóre flagi w poleceniu „otwórz” nie działają, mimo że wydaje mi się, że zawieram prawidłowe pliki nagłówkowe. To prawdopodobnie prosty problem, który przejrzałem.

Problem pojawia się, gdy „S_IRUSR” i „S_IWUSR” wydają się być niezdefiniowane. Nie napisałem więcej kodu poza tym, więc opublikuję wszystko, co mam.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>

void usage(char *prog_name, char *filename)
{
    printf("Usage: %s <data to add to %s>\n", prog_name, filename);
    exit(0);
}

void fatal(char *);
void *ec_malloc(unsigned int);

int main(int argc, char *argv[])
{
    int fd; //file descriptor
    char *buffer, *datafile;

    buffer = (char *) ec_malloc(100);
    datafile = (char *)ec_malloc(20);
    strcpy(datafile, "/tmp/notes");

    if (argc > 2)
        usage(argv[0], datafile);

    strcpy(buffer, argv[1]);

    printf("[DEBUG] buffer\t @ %p: \'%s\'\n", buffer, buffer);
    printf("[DEBUG] datafile\t @ %p: \'%s\'\n", datafile, datafile);

    strncat(buffer, "\n", 1);

    //opening file - this line of code is causing the problem.
    fd = open(datafile, O_WRONLY |O_CREAT | O_APPEND, S_IRUSR|S_IWUSR) 
}

void fatal(char *message)
{
    char error_message[100];

    strcpy(error_message, "[!!] Fatal Error ");
    strncat(error_message, message, 83);
    perror(error_message);
    exit(-1);
}

void *ec_malloc(unsigned int size)
{
    void *ptr;
    ptr = malloc(size);
    if (ptr == NULL)
        fatal("in ec_malloc() on memory allocation");
    return ptr;
}

Jak mówię, nie wierzę, że są tam jakieś literówki i, o ile wiem, są tam prawidłowe nagłówki, ale popraw mnie, jeśli się mylę. Dzięki za wszelką pomoc.


person Daniel Baron    schedule 22.02.2015    source źródło
comment
Nie sądzę, żeby było tam jakieś literówki - cóż, na początek jest S_IWSUR.   -  person Crowman    schedule 22.02.2015


Odpowiedzi (2)


Zapomniałeś dołączyć stdio.h i literówkę w S_IWUSR i zapomniałeś średnika.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>

void usage(char *prog_name, char *filename)
{
printf("Usage: %s <data to add to %s>\n", prog_name, filename);
exit(0);
}

void fatal(char *);
void *ec_malloc(unsigned int);

int main(int argc, char *argv[])
{
int fd; //file descriptor
char *buffer, *datafile;

buffer = (char *) ec_malloc(100);
datafile = (char *)ec_malloc(20);
strcpy(datafile, "/tmp/notes");

if (argc > 2)
    usage(argv[0], datafile);

strcpy(buffer, argv[1]);

printf("[DEBUG] buffer\t @ %p: \'%s\'\n", buffer, buffer);
printf("[DEBUG] datafile\t @ %p: \'%s\'\n", datafile, datafile);

strncat(buffer, "\n", 1);

//opening file - this line of code is causing the problem.
    fd = open(datafile, O_WRONLY |O_CREAT | O_APPEND, S_IRUSR|S_IWUSR);
   }

    void fatal(char *message)
    {
    char error_message[100];

strcpy(error_message, "[!!] Fatal Error ");
strncat(error_message, message, 83);
perror(error_message);
exit(-1);
}

void *ec_malloc(unsigned int size)
{
void *ptr;
ptr = malloc(size);
if (ptr == NULL)
    fatal("in ec_malloc() on memory allocation");
return ptr;
}
person Mark Nicolle    schedule 22.02.2015
comment
zobacz moją odpowiedź poniżej :D - person yan bellavance; 25.06.2017

Ogólnie rzecz biorąc, bardzo pomocne jest uwzględnienie dokładnych komunikatów, które poinformuje kompilator.

W takim przypadku mój kompilator zgłosi:

cc     foo.c   -o foo
foo.c:8:5: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)'
    printf("Usage: %s <data to add to %s>\n", prog_name, filename);
    ^
foo.c:8:5: note: please include the header <stdio.h> or explicitly provide a declaration for 'printf'
foo.c:35:63: error: use of undeclared identifier 'S_IWSUR'
    fd = open(datafile, O_WRONLY |O_CREAT | O_APPEND, S_IRUSR|S_IWSUR) 
                                                              ^
foo.c:44:5: warning: implicit declaration of function 'perror' is invalid in C99 [-Wimplicit-function-declaration]
    perror(error_message);
    ^
2 warnings and 1 error generated.

Czytając to możemy znaleźć dwa błędy:

  1. Musisz dołączyć stdio.h dla printf().
  2. S_IWSUR jest błędnie napisany. Powinno być S_IWUSR.
person Bill Lynch    schedule 22.02.2015
comment
Nie skopiował poprawnie; y, zawarłem wszystkie te rzeczy, ale nadal nie działa. Używam kompilatora C/C++ z Visual Basic i mówi, że te dwie flagi są niezdefiniowane. - person Daniel Baron; 23.02.2015
comment
@DanielBaron: Czy możesz dołączyć dokładne komunikaty o błędach, które otrzymujesz w swoim pytaniu? To znaczy, czy możesz go skopiować (lub zrobić zrzut ekranu) i skopiować bezpośrednio słowo w słowo do swojego pytania? - person Bill Lynch; 23.02.2015
comment
„błąd C2065: „S_IRUSR”: niezadeklarowany identyfikator” i „błąd C2065: „S_IWUSR”: niezadeklarowany identyfikator” i to ostrzeżenie „ostrzeżenie C4013: „otwarte” niezdefiniowane przy założeniu, że extern zwraca int” - person Daniel Baron; 23.02.2015
comment
@DanielBaron: Jaki jest twój kompilator (łącznie z wersją)? Przypuszczalnie to jakaś wersja studia wizualnego? - person Bill Lynch; 23.02.2015
comment
Mircrosoft Visual Studio Express 2013 dla systemu Windows. Wersja 12.0.21005.1 REL i Microsoft .NET Framework. Wersja 4.5.51209 - person Daniel Baron; 23.02.2015
comment
Dodatkowo, czy możesz opublikować pełne dane wyjściowe z preprocesora dla tego pliku? stackoverflow.com/questions/8978997/ Publikowanie go na gist.github.com byłoby w porządku, podobnie jak inline w pytaniu. - person Bill Lynch; 23.02.2015
comment

Zamień change na ngModelChange

Zmień z

<input mdInput 
       [mdDatepicker]="datePicker" 
       placeholder="Choose Date" 
       name="date" [(ngModel)]="date" 
       (change)="updateCalcs()" required>

To

<input mdInput 
       [mdDatepicker]="datePicker" 
       placeholder="Choose Date" 
       name="date" [(ngModel)]="date" 
       (ngModelChange)="updateCalcs()" required>
- person Daniel Baron; 23.02.2015
comment
@DanielBaron: Tak. Tego bym się spodziewał. I chciałbym móc zobaczyć całość. - person Bill Lynch; 23.02.2015