URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5361
[ Назад ]

Исходное сообщение
"Ошибка: near initialization for ... и initializer element is not cons[BR]"

Отправлено Zlodei , 21-Апр-06 10:32 
При компиляции выдается следующее сообщение:
make -C /lib/modules/2.6.9-1.667asp/build M=/home/Nikolai modules
make[1]: Entering directory `/lib/modules/2.6.9-1.667asp/build'
  CC [M]  /home/Nikolai/mydrv.o
/home/Nikolai/mydrv.c:24: error: `mydrv_open' undeclared here (not in a function)
/home/Nikolai/mydrv.c:24: error: initializer element is not constant
/home/Nikolai/mydrv.c:24: error: (near initialization for `mydrv_fops.open')
/home/Nikolai/mydrv.c:25: error: `mydrv_release' undeclared here (not in a function)
/home/Nikolai/mydrv.c:25: error: initializer element is not constant
/home/Nikolai/mydrv.c:25: error: (near initialization for `mydrv_fops.release')
/home/Nikolai/mydrv.c: In function `mydrv_open':
/home/Nikolai/mydrv.c:92: warning: implicit declaration of function `mydrv_trim'
/home/Nikolai/mydrv.c: At top level:
/home/Nikolai/mydrv.c:77: warning: `mydrv_setup_cdev' defined but not used
make[2]: *** [/home/Nikolai/mydrv.o] Ошибка 1
make[1]: *** [_module_/home/Nikolai] Ошибка 2
make[1]: Leaving directory `/lib/modules/2.6.9-1.667asp/build'
make: *** [default] Ошибка 2

Исходник mydrv.c
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/ioport.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/types.h>
#include "mydirect.h"
#include <linux/cdev.h>
#include <linux/slab.h>

MODULE_LICENSE("DUAL BSD/GPL");
MODULE_AUTHOR ("Dorofeev Nikolai Viktorovich");
MODULE_SUPPORTED_DEVICE ("ADC card");

struct file_operations mydrv_fops = {
.owner = THIS_MODULE,
/* .llseek = mydrv_llseek,
.read = mydrv_read,
.write = mydrv_write,
.ioctl = mydrv_ioctl,
*/
.open = mydrv_open,
.release = mydrv_release,

};

struct mydrv_dev
{
//POinter to first quantum set
struct mydrv_qset *data;
//the current quantum size
int quantum;
//the current array size
int qset;
//amount of data stored here
unsigned long size;
//user by sculluid and mydrvpriv
unsigned int access_key;
//mutual exclusion semaphore
struct semaphore sem;
//Char device structure
struct cdev cdev;
};

struct mydrv_qset
{void **data;
struct mydrv_qset *next;
};

int mydrv_major = MYDRV_MAJOR;
int mydrv_minor = MYDRV_MINOR;
int dev;
int result;
int mydrv_nr_devs = 1;

static int my_init(void)
{
if (mydrv_major)
{dev=MKDEV(mydrv_major,mydrv_minor);
result=register_chrdev_region(dev,mydrv_nr_devs,"mydrv");
}
else
{result=alloc_chrdev_region(&dev,mydrv_minor,mydrv_nr_devs,"mydrv");
mydrv_major=MAJOR(dev);
}
if (result<0)
{printk(KERN_WARNING "mydrv: can't get major %d\n",mydrv_major);
return result;
}
printk(KERN_ALERT "mydrv: Insert driver\n");
return 0;
};

static void mydrv_setup_cdev(struct mydrv_dev *dev,int index)
{int err, devno = MKDEV(mydrv_major,mydrv_minor+index);
cdev_init(&dev->cdev,&mydrv_fops);
dev->cdev.owner = THIS_MODULE;
dev->cdev.ops = &mydrv_fops;
err = cdev_add(&dev->cdev,devno,1);
//Fail gracefully if need be
if (err) printk(KERN_NOTICE "Error %d adding mydrv%d",err, index);
};

int mydrv_open(struct inode *inode, struct file *filp)
{struct mydrv_dev *dev; //device information
dev=container_of(inode->i_cdev,struct mydrv_dev,cdev);
filp->private_data = dev; //for other methods
//now trim to 0 the length of the device if open was write-only
if ((filp->f_flags & O_ACCMODE) == O_WRONLY)
{mydrv_trim(dev); //ignore errors
}
return 0;//success
};

int mydrv_release(struct inode *inode, struct file *filp)
{return 0;
};

int mydrv_trim(struct mydrv_dev *dev)
{struct mydrv_qset *next, *dptr;
int qset = dev->qset; //*"dev" is not-null
int i;
int mydrv_quantum = MYDRV_QUANTUM;
int mydrv_qset = MYDRV_QSET;

for (dptr = dev->data; dptr; dptr = next) //all the list items
{if (dptr->data)
   {for (i = 0; i < qset; i++)
     kfree(dptr->data[i]);
    kfree(dptr->data);
    dptr->data = NULL;
   }
next = dptr->next;
kfree(dptr);
}
dev->size = 0;
dev->quantum = mydrv_quantum;
dev->qset = mydrv_qset;
dev->data = NULL;
return 0;
};

static void my_cleanup(void)
{
unregister_chrdev_region(dev,mydrv_nr_devs);
//unregister_chrdev(mydrv_major,"mydrv");
//if (result<0)
//{printk(KERN_WARNING "mydrv: can't unregister dev\n");
//return result;
//}
printk(KERN_ALERT "mydrv: Remove driver\n");
};

module_init(my_init);
module_exit(my_cleanup);


Содержание

Сообщения в этом обсуждении
"Ошибка: near initialization for ... и initializer element is..."
Отправлено Vic , 21-Апр-06 15:23 
>При компиляции выдается следующее сообщение:
>/home/Nikolai/mydrv.c:24: error: `mydrv_open' undeclared here (not in a function)

Прототип mydrv_open() нужен перед первым обращением к функции в объявлении структуры struct file_operations mydrv_fops