C Программирование. Как глубоко скопировать структуру?

Можно создать пользовательский ActionResult, который делает в значительной степени что-либо. ActionResult управляет тем, что передают обратно клиенту как ответ. Это было бы тривиально для создания класса, который расширяет ActionResult, который ничего не делает.

8
задан dmckee 25 September 2009 в 00:29
поделиться

6 ответов

Да, вам нужна повторная рекомендация по транзакции. Обратите внимание, что в следующей конфигурации выражение pointcut выбирает конкретный bean-компонент CompanyService.

<bean id="companyService1" class="com.company.service.CompanyServiceImpl">
  <property name="companyDao">
    <bean class="com.company.service.CompanyDAO">
      <property name="dataSource" ref="dataSource1"/>
    </bean>
  </property>
</bean>

<aop:config>
  <aop:pointcut
      id="companyServicePoint1"
      expression="bean(companyService1)"/>
  <aop:advisor
      advice-ref="companyServiceTxAdvice1"
      pointcut-ref="companyServicePoint1"/>
</aop:config>

<tx:advice id="companyServiceTxAdvice1" transaction-manager="txManager1">
  <tx:attributes>
    <!-- set propogation required on create methods, all others are read-only -->
    <tx:method name="create*" propagation="REQUIRED"/>
    <tx:method name="*" read-only="true"/>
  </tx:attributes>
</tx:advice>

<bean
    id="txManager1" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource1"/>
</bean>

Для настройки другого bean-компонента CompanyService необходимо продублировать тот же подробный шаблон. Другой способ разграничения транзакций в Spring использует TransactionProxyFactoryBean . Он немного менее подробен, потому что он использует определение родительского компонента для настройки общих свойств, унаследованных дочерними компонентами. но имеющийся у вас параметр char * name будет указывать на то же исходное значение.

0
ответ дан 5 December 2019 в 05:19
поделиться

Просто:

childB.usage = childA.usage;
20
ответ дан 5 December 2019 в 05:19
поделиться

childB.usage = childA.usage

Поскольку у вас есть вся структура внутри дочерней структуры, достаточно простой копии. Если бы у вас был указатель на структуру rusage внутри дочерней структуры, это могло быть проблемой. В этом случае вам пришлось бы выделить память для childB.usage, а затем выполнить memcpy, чтобы, если кто-нибудь изменит / удалит childA, childB не пострадает.

0
ответ дан 5 December 2019 в 05:19
поделиться

Shouldn't it be:

memcpy(&(childB.usage), &(childA.usage), sizeof(rusage))
10
ответ дан 5 December 2019 в 05:19
поделиться

Вы можете указать два этих параметра двумя способами, как уже упоминалось другими.

1) childB.usage = childA.usage;
2) memcpy (& childB.usage, & childA.usage, sizeof (rusage));

Первый аргумент memcpy - это место назначения, второй - источник, а третий - длина (сколько байтов вы хотите скопировать). Судя по опубликованному вами коду, вы пытались скопировать весь childB в childA, что на самом деле вам не нужно.

0
ответ дан 5 December 2019 в 05:19
поделиться

в этом файле я копирую элементы origin в destinazione, сначала только используя присваивания и strcpy, затем я копирую origine в memres, используя только memcpy

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct inner
{
    char *parola;
    int n;
} interna;

typedef struct outer
{
    struct inner *ptr;
    int numeroesterno;
} esterna;


struct another
{
    struct inner *ptr;
    int numero;
};    //never forget ; here

int main(void)
{
    esterna *origine; //ptr to structs
    struct another *destinazione;
    struct another *memres;

    char *tmpParola;
    tmpParola = malloc(30*sizeof(char));
    strcpy(tmpParola, "AAAAA");

    interna *tmp;  //remember the TYPEDEF, and don't use struct interna
    tmp = (interna *)malloc(sizeof(struct inner));
    // if you use struct interna in sizeof you get
    //  error: invalid application of ‘sizeof’ to incomplete type ‘struct interna’ 

    tmp->n = 500;
    tmp->parola = tmpParola;

    origine = (esterna *)malloc(sizeof(struct outer));

    origine->numeroesterno = 2;
    origine->ptr = tmp;  //the data structer pointed by tmp has already been allocated and set

    // now I have the structure allocated and set, I want to copy this on destinazione
    destinazione = (struct another *)malloc(sizeof(struct another));

    destinazione->numero = origine->numeroesterno;

    //destinazione->ptr = tmp;  //in this case you don't copy struct inner, it's just a reference

    destinazione->ptr = (interna *)malloc(sizeof(struct inner));
    destinazione->ptr->parola = malloc(sizeof(char)*30);
    strcpy(destinazione->ptr->parola, origine->ptr->parola);
    destinazione->ptr->n = 111;

    //modify origine

    origine->numeroesterno = 9999;
    strcpy(origine->ptr->parola, "parola modificata in origine");

    //print destinazione

    printf("\nparola in destinazione :%s\n", destinazione->ptr->parola);
    printf("\nparola in origine :%s\n", origine->ptr->parola);

    //you can see that destinazione is a copy, because mofifying origine, destinazione deosn't change

    //now we play with memcpy

    memres = (struct another *)malloc(sizeof(struct another));

    memcpy(memres, destinazione, sizeof(destinazione)); //till here, is AAAAA
    strcpy(destinazione->ptr->parola, "parola modificata in destinazione");

    printf("\nmemcpy, numero %d\n", memres->numero);
    printf("\nmemcpy, parola :%s\n", memres->ptr->parola);

    //as you can see from the output, memcpy doesn't make a copy of destinazione:
    //modifying destinazione->ptr->parola after the assignment affects what memres carries with it
    //So from the idea that I got, memcpy just creates the pointers to the originary structure

    free(origine->ptr->parola);
    free(origine->ptr);
    return 0;
}
0
ответ дан 5 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: