Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: передача значений си(переменных)  (Прочитано 1047 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн jonik908

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
передача значений си(переменных)
« : 08 Декабря 2013, 20:34:18 »
Доброго времени суток!!!
Сам не знаю каково лешего меня дернуло на язык программирования СИ.
Картина такая:
есть 2 алгоритма из книги
Первый: получает путь директории откуда он запушен
char* dir;
int len =50;
getcwd(dir, len);
printf("Current directory is %s\n", dir);
Второй: получает содержимое директории
   DIR *dir;
    struct dirent *ent;
    char dir[255] = "./";<< вот здесь я и встрял...
    char directory[255] = dir[255];
    dir = opendir(directory);

    while ((ent=readdir(dir)) != NULL){
        printf("%s\n", ent->d_name);
    }
    closedir(dir);

char dir[255] = "./";<< здесь принимается параметр в кавычках
char dir[255] = переменная;<< передаю переменную содержащую текущей каталог  без кавычек. соответственно возникает ошибка


Это только основные конструкции. понятно что, если это склеить вместе, то работать не будет...
Хочу понять принцип взаимодействия.
 

Пользователь решил продолжить мысль 08 Декабря 2013, 20:44:43:
решено :2funny:

#include <dirent.h>
#include <stdio.h>

int main()
{
    char dirname[NAME_MAX];
    DIR *dirh;
    struct dirent *dirent;

    getcwd(dirname, sizeof(dirname)-1);
    printf("Current directory is %s\n", dirname);

    dirh = opendir(dirname);
    while( dirent=readdir(dirh) )
    {
        printf("%s\n", dirent->d_name);
    }
    closedir(dirh);
    return 0;
}
« Последнее редактирование: 08 Декабря 2013, 20:45:41 от jonik908 »

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #1 : 09 Декабря 2013, 02:15:36 »
jonik908, тебе нужен путь откуда его запустили или где он лежит? Первое можно проще, почитай про argc argv.
И почему
Цитировать
getcwd(dirname, sizeof(dirname)-1);
Объяснить сможешь? ;)

Оффлайн jonik908

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #2 : 11 Декабря 2013, 14:12:56 »
1. тебе нужен путь откуда его запустили == почитай про argc argv. << Спасибо!
2. getcwd(dirname, sizeof(dirname)-1); << В силу скудного знания языка СИ, объяснить не смогу, но я активно работаю в этом направлении.

Пока не совсем понимаю принципы взаимодействия.

Основная задача заключается в следующем:
Есть кусок «быдло-кода» написанный мной на GTK, GtkImage (ну что, Нашел)  который может показывать картинки.
Две кнопки, по нажатию на которые, картинка меняется, забирая значение из массива, заполненного ручным методом, в котором содержатся пути к картинкам.

В данный момент пытаюсь найти информацию о том, как система Ubuntu понимает что, картинку, которую я вижу в Файловом менеджере, нужно открыть именно моим приложением. Как мое приложение может понять, откуда его запустили, как получить список файлов (картинок), которые оно может обработать.


Вся проблема заключается в смутном понимании основных механизмов взаимодействия приложения с системой, а знать все ровно хочется.
Все знакомые программисты делают умный вид и предлагают способ, описанный мной в первом сообщении, с последующий работай через библиотеку string.h.
1. получить путь текущего каталога
2. найти все файлы
3. отфильтровать файлы по расширению stringом
4. склеить путь папки и само название файла stringом
5. запилить в массив

Но мне почему-то кажется, что это не совсем правильно. Так как расширения бывают  разные (jpg, jpeg, JPG) то конструкция получится, на мой взгляд, убогой.
Я что-то слышал про MiME-типы, но опять же информации мало и разнится от источника к источнику.


Буду рад любой хоть сколько не будь полезной информации.
Может есть Кусок кода с примером(чтобы посмотреть как оно должно вообще выглядеть)



 

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #3 : 11 Декабря 2013, 14:31:49 »
взаимодействие приложения с системой может быть разным, в вашем случае проще через аргументы передаваемые приложению при запуске именно так передает файловый менеджер имя файла программе которая с ним связана, а вот как будет обрабатывать программа переданый аргумент это уже забота разработчика программиста
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн jonik908

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #4 : 11 Декабря 2013, 14:46:33 »
Самый главный вопрос. Как мне из папки вытащить(парсить ... загнать в массив, ну или как там правильно сказать) картинки (*.jpg *.png *.tiff) !правильным! способом.
Велосипед я всегда сделать успею.
« Последнее редактирование: 11 Декабря 2013, 14:48:06 от jonik908 »

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #5 : 11 Декабря 2013, 17:01:39 »
В одной из книг по С

DIR *dfd;
    struct dirent *dp;
    char filename[NAME_MAX];
 
    if ( argc < 2 )
        strcpy(filename, ".");
    else
        strcpy(filename, argv[1]);
 
    printf("%s\n\n", filename);
    dfd=opendir(filename);
 
    while( (dp=readdir(dfd)) != NULL )
            printf("%s\n", dp->d_name);
 
    closedir(dfd);
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн jonik908

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #6 : 12 Декабря 2013, 09:56:32 »
Я не о том..неправильно выразился в предыдущем сообщение.

код который выводит список файлов
#include <stdio.h>
#include <dirent.h>
int main (void) {
    DIR *dir;
    struct dirent *ent;
    char directory[255] = "./";
    dir = opendir(directory);
    while ((ent=readdir(dir)) != NULL){
        printf("%s\n", ent->d_name);
    }
    closedir(dir);
    return 0;}

компилирую

user@user-pc$ ./a.out //выполняю программу
text1.txt<----------------------------------------ненужен
картинка_1.jpg<------------------------------НУЖЕН
text2.txt<----------------------------------------ненужен
картинка2.jpeg<------------------------------НУЖЕН
book1.pdf<--------------------------------------ненужен
красивая картинка.bmp<-----------------НУЖЕН
музыка.mp3<----------------------------------ненужен
очень красивая картинка.JPG<-------НУЖЕН
многобукв.doc<------------------------------ненужен
опять картинка.TIFF<----------------------НУЖЕН

ТО ЕСТЬ мне нужно
Выбрать из папки с разными файлами, только те файлы, которые относятся к изображениям.
user@user-pc$ ./a.out //выполняю программу
картинка_1.jpg<------------------------------НУЖЕН
картинка2.jpeg<------------------------------НУЖЕН
красивая картинка.bmp<-----------------НУЖЕН
очень красивая картинка.JPG<-------НУЖЕН
опять картинка.TIFF<----------------------НУЖЕН


Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #7 : 12 Декабря 2013, 11:06:07 »
Я не о том..неправильно выразился в предыдущем сообщение.

код который выводит список файлов
#include <stdio.h>
#include <dirent.h>
int main (void) {
    DIR *dir;
    struct dirent *ent;
    char directory[255] = "./";
    dir = opendir(directory);
    while ((ent=readdir(dir)) != NULL){
        printf("%s\n", ent->d_name);
    }
    closedir(dir);
    return 0;}

компилирую

user@user-pc$ ./a.out //выполняю программу
text1.txt<----------------------------------------ненужен
картинка_1.jpg<------------------------------НУЖЕН
text2.txt<----------------------------------------ненужен
картинка2.jpeg<------------------------------НУЖЕН
book1.pdf<--------------------------------------ненужен
красивая картинка.bmp<-----------------НУЖЕН
музыка.mp3<----------------------------------ненужен
очень красивая картинка.JPG<-------НУЖЕН
многобукв.doc<------------------------------ненужен
опять картинка.TIFF<----------------------НУЖЕН

ТО ЕСТЬ мне нужно
Выбрать из папки с разными файлами, только те файлы, которые относятся к изображениям.
user@user-pc$ ./a.out //выполняю программу
картинка_1.jpg<------------------------------НУЖЕН
картинка2.jpeg<------------------------------НУЖЕН
красивая картинка.bmp<-----------------НУЖЕН
очень красивая картинка.JPG<-------НУЖЕН
опять картинка.TIFF<----------------------НУЖЕН



Вы хотите что бы я за Вас решил задачу ? я вам предоставил 90% решения вопроса, отфильтвровать по типу файлов проще пареной репы, можно по ламерски, сравнивать расширение, а можно по правильному читать тип файла из самого файла, вопрос в том что нужно вам....
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн jonik908

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #8 : 12 Декабря 2013, 11:50:15 »
вот вот!!!! Ты сам начал мне разжевывать... только зачем??
Мне не нужно решение, Мне нужна информация!!!!!!!!!!!!!!!!!!
..... Нужно Объяснения алгоритма
Цитировать
отфильтвровать по типу файлов проще пареной репы, можно по ламерски, сравнивать расширение, а можно по правильному читать тип файла из самого файла, вопрос в том что нужно вам....
именно такой ответ я хотел и получить
 
Нужно по правильному!
Какую библиотеку для считывание типа из файла, лучше использовать(!Стандартной)?
Мне нужно просто название библиотеки, ну и как бонус ссылку на хорошую статейку по ней, если конечно есть!



 

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #9 : 12 Декабря 2013, 11:59:19 »
нет никакой библиотеки, зачем городить зависимость для приложения ?  если используете GTK то смотри есть ли у него возможность работать с ижображениями, но уверен что нет так как некоторые изображения не совместимы с лицензией  gtk, так что просто напишите функцию которая сама определяет тип файла, так получите опыт работы с изображениями и их структурой.
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн jonik908

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #10 : 12 Декабря 2013, 13:26:52 »
с файлами немного понятно.
для рендеринга изображений, тоже лучше использовать свой код?
в GTK  был виджет для показа изображения. не сканет???
в Glib вроде есть более низкоуровневые функции для отрисовки изображений.
Насколько глубоко опускаться???
« Последнее редактирование: 12 Декабря 2013, 13:30:04 от jonik908 »

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #11 : 12 Декабря 2013, 13:30:17 »
для рендеринга уже проще, вы же используете GTK вот его средствами и отображайте изображение
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн jonik908

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #12 : 12 Декабря 2013, 13:49:50 »
ОК. ну и напоследок, если не трудно :)
парочку ссылок на материалы с которых стоит начать.
больше всего интересует ТИПЫ файлов..
http://habrahabr.ru/post/186828/ единственно что я нашел более или менее нормальное по этой теме( но напрягает #include <magic.h>

Онлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Извините, я все еще учусь

Оффлайн jonik908

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: передача значений си(переменных)
« Ответ #14 : 12 Декабря 2013, 14:04:13 »
Уже лучше.

Пользователь решил продолжить мысль 12 Декабря 2013, 14:16:03:
:) всем спасибо!  я нашел что искал
« Последнее редактирование: 12 Декабря 2013, 14:16:03 от jonik908 »

 

Страница сгенерирована за 0.02 секунд. Запросов: 21.