Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does the name of a source file affect compilation?

I came across something really weird when I wrote a little lotto program in C++ called "lotto.cpp". Everything was fine until I wrote the write-to-file for my program. When I compiled, it showed me the following error:

ld: can't open output file for writing: lotto, errno=21 for architecture x86_64
collect2: ld returned 1 exit status

By coincidence, I changed the name of my program to "1.cpp", and all of a sudden it compiled without problems. It also worked when I changed the name to "test.cpp".

I am really curious as to why this happened. Any Ideas?

This happened on a MacBook Pro.

If you want the code as well, just let me know!


I know some people asked for the code. Here it is:

#include <iostream>
#include <fstream>

using namespace std;

const int NED  = 10;            
const int VIKING =  6;
const int NORMAL =  7;
const int MAX  = 10;

void quickSort(int arr[], int left, int right);
int checkDuplicates(int arr[], int length);

int main (int argc, const char *argv[])
{
    int i, j, k, ans;
    char ans2;
    int lottoNumbers[MAX];

    ofstream out("Lotto.txt", ios::out | ios::app);

    srand((unsigned)time(NULL));    

    do
    {
        do
        {
            cout << "\n\nDo you want to play Viking Lotto (press 6), or normal Lotto (press 7): ";
            cin >> ans;
        }while(ans != VIKING && ans != normal);

        (ans == VIKING) ? cout << "\nViking Lotto:\n" : cout << "\n\nnormal Lotto:\n";
        (ans == VIKING) ? out << "\nViking Lotto:\n" : out << "\n\nnormal Lotto:\n";


        for (i = 0; i < NED; i++)       //10 rows
        {       
            for (j = 0; j < ans; j++)  //6 or 7 columns
            {
                (ans == VIKING) ? lottoNumbers[j] = (rand() % 48) + 1 : lottoNumbers[j] = (rand() % 34) + 1;
            }
            if(checkDuplicates(lottoNumbers, ans) != -1)        
            {
                for(k = 0; k < ans; k++)
                {
                    while(checkDuplicates(lottoNumbers, ans) == lottoNumbers[k])    
                    {
                        (ans == VIKING) ? lottoNumbers[k] = (rand() % 48) + 1 : lottoNumbers[k] = (rand() % 34) + 1;
                    }
                }
            }
            quickSort(lottoNumbers, 0, ans - 1);  
            cout << '\n';

            for(j = 0; j < ans; j++)
            {
                cout << lottoNumbers[j] << '\t'; 
                out << lottoNumbers[j] << '\t';
            }
            out << '\n';

        }   
        cout << "\n\n";


        cout <<"Another lottery ticket (Y/N) ";
        cin >> ans2;
    }while(ans2 == 'j' || ans2 == 'J');

    cout << "\n\nLOTTO NUMBERS WAS WRITTEN TO FILE...\n\n";

    return 0;
}

void quickSort(int arr[], int left, int right) 
{
    int i = left, j = right;
    int tmp;
    int mid = arr[(left + right) / 2];

    while (i <= j) 
    {
        while (arr[i] < mid)    i++;
        while (arr[j] > mid)    j--;
        if (i <= j) 
        {
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    };
    if (left < j)   quickSort(arr, left, j);
    if (i < right)  quickSort(arr, i, right);
}

int checkDuplicates(int arr[], int length)  
{                                       
    for(int i = 0; i < length; i++)
    {
        for(int j = i + 1; j < length; j++)
        {   
            if(arr[i] == arr[j])    return arr[j];
        }
    }
    return -1;  
}
like image 941
Nilzone- Avatar asked Feb 08 '12 20:02

Nilzone-


People also ask

What happens when source code is compiled?

A compiler takes the program code (source code) and converts the source code to a machine language module (called an object file). Another specialized program, called a linker, combines this object file with other previously compiled object files (in particular run-time modules) to create an executable file.

What is the difference between a header file and a source file?

Header files are typically used for declaration purposes, while source files are used for implementation (definition) purposes. This allows a source (say b. cpp) file to include your header file (say a.h) to call the functions in a.

Why do we separate header and source files?

The main reason for header files is to enable separate compilation of files, and minimize dependencies.

What is compilation source?

A compilation means to transform a program written in a high-level programming language from source code into object code. Programmers write programs in a form called source code. Source code must go through several steps before it becomes an executable program.


2 Answers

Error number 21 (on MacOS X 10.7.2) is EISDIR: Is a directory.

The name lotto seems to be a directory, not a file.

like image 60
Jonathan Leffler Avatar answered Sep 25 '22 16:09

Jonathan Leffler


This is a linker error that states that we cannot write to the 'lotto' file on your computer while compiling. My guess is that either your program is still running, or you accidentally created a directory called 'lotto'. It's possible that your write-to-file function is keeping the application running, or itself tried to create a lotto directory.

like image 33
Arelius Avatar answered Sep 24 '22 16:09

Arelius